EasyTerritory MCP
Server Details
Build, balance, realign and analyze sales/service territories; geocode, route, schedule, live map.
- Status
- Healthy
- Uptime
- 100.0% over the last 24 hours
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 58 tools
Most tools have sharply distinct resource+action targets, and descriptions actively cross-reference neighbors (e.g. set_map_state explains it is session-only while configure_map sets a durable default; route workload vs territory workload is called out repeatedly). The weakest spots are the meta/orchestration cluster (ezt, discover_intent, workflow_advisor, get_guidance, ep_search) and the several *_build variants (auto_build, account_build, direct_build, seed_build, isochrone_build), which an agent must read carefully to separate. Still, explicit 'Related:' cues keep practical ambiguity low.
The dominant pattern is snake_case, but it mixes two conventions: verb_noun (create_territory_from_parts, delete_tal, get_map_selection, list_part_layers, analyze_routes) and noun_verb/compound (account_build, territory_merge, cluster_points, isochrone_build), plus bare verbs (analyze, realign, ezt) and reversed names (tasks_get, tasks_result, tasks_cancel). The families are internally consistent (delete_*, *_build, ep_*), so it stays readable, but the set is not uniform.
58 tools is heavy even for a broad enterprise territory platform, and several meta/helper tools (ezt orchestrator, workflow_advisor, discover_intent, get_guidance, three tasks_* equivalents, three ep_* expert-pack tools) pad the surface beyond the core domain. Each individual tool looks purposeful, so this is over-scale rather than noise, but an agent must navigate a very large menu.
Coverage is unusually deep: ingestion/geocoding, five build strategies, editing (realign, split, merge, rebalance, extract/reintegrate), analysis, routing, isochrones, scheduling, coverage gaps, export/import, Designer and Dataverse sync, and task plumbing. Minor gaps exist in enumeration/discovery—there is no dedicated tool to list existing alignments, point layers, or routes on a solution (agents must infer from error payloads or ezt:// resources)—but no lifecycle dead ends.
Available Tools
58 toolsaccount_buildBuild Territories by Account FieldAInspect
Builds territories that follow an account column, such as rep name or territory code from CRM: each part goes to the group holding most of its accounts (conflict_policy). Adds a new alignment (TAL). Needs an ingested point_layer, grouping_field, part_layer, and tal_label. Grouping values are labels, not balance metrics. part_scope: bbox_intersect (default; parts near the accounts) or explicit with part_filter, e.g. {state_abbr: TX}. A declared visit-frequency column needs visit_frequency_field or ignore_visit_frequency (CLARIFICATION_REQUIRED otherwise). With map_session_id the open map is the input. Returns a task; the result carries tal_id and ts_handle. analyze reports the statistics.
| Name | Required | Description | Default |
|---|---|---|---|
| part_ids | No | Explicit part selection set. Implies part_scope explicit. Mutually exclusive with part_filter. | |
| tal_label | No | ||
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| part_layer | No | ||
| part_scope | No | Parts eligible for Account Build geography. Default bbox_intersect: all parts intersecting the account-point bounding box. point_matched: only parts containing at least one account (radial seeds only; no FCFS inflate). explicit: part_ids or part_filter (e.g. state_abbr FL). Scope fill uses FCFS adjacency inflate from cluster radial seeds, not national nearest-anchor fill. | |
| output_mode | No | tal is the default. assignments returns assignments_artifact plus an authenticated download_url and a key-less share_url; no ts_handle, tal_id, or map_refresh. | tal |
| part_filter | No | Attribute filter resolved via query_parts (e.g. {"state_abbr": ["FL", "GA"]}). Implies part_scope explicit. Mutually exclusive with part_ids. | |
| point_layer | Yes | ||
| repair_policy | No | Topology repair for dissolved territories. default fills interior holes in the dissolved geometry (no part is added or reassigned; repair_summary.changed_part_ids lists the territories' own parts). report_only detects holes and changes nothing (warning REPAIR_AVAILABLE). strict fails with REPAIR_REQUIRED when a hole is found. | default |
| grouping_field | No | Point feature property treated as a grouping label even when numeric. | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| conflict_policy | No | When accounts in one part map to multiple grouping labels, assign the part to the label with the highest account count; ties break by deterministic label sort. | plurality_account_count |
| expected_revision | No | ||
| visit_frequency_field | No | Point column that scales territory workload by visits per cycle. Mutually exclusive with ignore_visit_frequency. | |
| ignore_visit_frequency | No | When true, every account is one visit per cycle. Mutually exclusive with visit_frequency_field. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
analyzeAnalyze TerritoriesAInspect
Computes territory statistics for one or more alignments, i.e. how balanced the territories are and how alignments compare: account counts, declared metric totals (e.g. Revenue), workload hours, balance scores, and cross-TAL comparison; hypothetical_moves previews a realign. Input: map_session_id (the open map as it is now), ts_handle, or a completed build job_id (pass tal_ids when several TALs exist). metrics: omit for every declared column, or name them; workload and account_count are always available. Workload needs dwell (dwell_time, the build's recorded dwell, or the layer's dwell_time_field); without it the result has every other statistic, no workload, and workload_omitted.ask_user, the question for the user. analysis_panel=single with map_session_id fills the map's analysis dock (analysis_panel.status=pushed). Territory account_count, metric_totals, and workload_total (minutes) cover only accounts_point_layer, never contractor or visit layers; point_counts_by_layer counts every layer. Drive-time alignments count accounts inside each polygon. Returns a task.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Optional — restrict analysis to a subset of parts or territories. | |
| job_id | No | task_id (same value as job_id) of a completed build or ingest task; its Territory Solution is the input. | |
| metrics | No | Data field names to aggregate per territory. If omitted, server returns all available metrics. | |
| tal_ids | No | TAL IDs to analyze. Defaults to the active TAL when unambiguous. | |
| max_depth | No | Optional. For hierarchical TALs, return rollup metrics only up to this depth level. Without it, every level is returned. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| dwell_time | No | ||
| part_layer | No | Part layer name. Required when not inferable from the TAL(s). Not used for a drive-time (isochrone) TAL, which is measured by polygon. | |
| compare_tals | No | When true and multiple tal_ids supplied, include a cross-TAL comparison section. | |
| analysis_panel | No | ||
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| hypothetical_moves | No | Optional. Compute impact of these hypothetical part moves without persisting any change. | |
| visit_frequency_field | No | Optional visit-frequency point column override for workload recompute. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
analyze_network_coverageAnalyze Contractor Network CoverageAInspect
Finds coverage gaps in a contractor (vendor, service provider, technician, repair shop) network: counts the contractors that reach each demand point (customer, claim, store, ZIP center). Reads contractor_layer (ingested with layer_role=contractors) and demand_layer. coverage: {rule: drive_time, max_minutes} (straight-line travel model, no provider calls), {rule: drive_time, source: isochrone_tal, isochrone_tal_id} (isochrone_build areas around the contractors), or {rule: zip_list} (declared service ZIPs). One trade per call ('*' for all). Missing layers, coverage, or trade return CLARIFICATION_REQUIRED with the question. Writes new layers, never the source: _coverage (contractor_count, single_source, coverage_class red none / amber one / green 2+ / blue saturated, nearest contractor and minutes, capacity_ratio, gap score) and _gaps; gap_territory=true adds the all-gap ZIPs as one territory. Assigns nothing; dividing work is auto_build. Returns a task; the result has coverage_pct, gap and single-source counts, top_gaps, and per-contractor reach.
| Name | Required | Description | Default |
|---|---|---|---|
| trade | No | One trade per call, matched case-insensitively against the comma-separated trade_field values. '*' (or 'all') keeps every contractor. Required when the contractor layer has a trade_field (needs_trade). | |
| coverage | No | What counts as covered. drive_time with source travel_model (default) needs max_minutes or max_km and uses the calibrated quadkey detour-factor model with CONSTITUTION speed-curve fallback (no provider calls). drive_time with source isochrone_tal needs isochrone_tal_id: a point is covered by a contractor when one of that contractor's isochrone_build polygons contains it (origin_id = contractor id); max_minutes, when given, drops wider time bands. zip_list uses each contractor's service_zip_field. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| tier_field | No | Overrides the contractor layer's tier_field. | |
| trade_field | No | Overrides the contractor layer's trade_field. | |
| demand_layer | No | Point layer of demand (customers, claims, stores, or ZIP centers). Defaults to the only other ingested layer. | |
| demand_metric | No | Numeric demand column (e.g. request count). Defaults to 1 per point; non-numeric cells count as 0 with warning DEMAND_METRIC_MISSING. | |
| gap_territory | No | Also draw ZIPs whose demand is all uncovered as one territory in a new TAL. | |
| capacity_field | No | Overrides the contractor layer's capacity_field. Enables capacity_ratio. | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| contractor_layer | No | Point layer of contractors. Defaults to the only layer ingested with layer_role=contractors; otherwise CLARIFICATION_REQUIRED (needs_contractor_layer). | |
| priority_weights | No | gap_priority weights; defaults demand 0.6, distance 0.4, single_source_factor 0.5. The formula is echoed in result.priority_formula. | |
| contractor_filter | No | Column -> value (or list of values), e.g. {"tier": "Preferred"}. The key tier maps to tier_field when the layer has no literal tier column. | |
| service_zip_field | No | Overrides the contractor layer's service_zip_field (required for zip_list). | |
| saturation_threshold | No | Contractor count at which a point is saturated (blue). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
analyze_routesAnalyze RoutesARead-onlyIdempotentInspect
Returns the total hours for each of the routes calculate_route has drawn: drive hours, dwell hours, route_workload_hours (provider drive time plus dwell, no visit-frequency multiplier), stop coordinates, centroid, and bbox. Synchronous. Needs map_session_id or ts_handle, and dwell from dwell_time or the dwell recorded on the route; unresolved dwell returns CLARIFICATION_REQUIRED (needs_dwell). A circuit's stop_count includes the return to the start, so that stop's dwell counts twice. Facts only: no capacity, ranking, or overload flags. These hours are a different measure from territory and cluster workload; territory statistics come from analyze.
| Name | Required | Description | Default |
|---|---|---|---|
| route_ids | No | Routes to report on, in the order returned. Absent means every route in the solution. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| dwell_time | No | ||
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
auto_buildAuto-Build TerritoriesAInspect
Partitions ingested account points into balanced sales territories with equal workload, metric, or count over a part layer (e.g. ZIPs) as a new alignment (TAL). Needs the user's choices: build_mode (fixed_territory_count + territory_count, fixed_workload_target + target_workload hours, or scoped_split), objective (workload_bias for drive time + dwell; metric + metric_bias for a column such as Revenue; biases sum to 100), and dwell_time (a column or a stated scalar). Each missing choice returns CLARIFICATION_REQUIRED with ask_user; a declared visit-frequency column also needs visit_frequency_field or ignore_visit_frequency. part_scope: bbox_intersect (default; parts near the accounts, can reach national scale) or explicit with part_filter, e.g. {state_abbr: TX}. The filter limits parts; accounts outside it stay on the layer, unassigned (UNASSIGNED_ACCOUNTS). With map_session_id the open map is the input. Returns a task; national builds take minutes and estimated_remaining_ms is capped, not a forecast. The result carries tal_id, ts_handle, and phase_timings_ms; analyze has statistics.
| Name | Required | Description | Default |
|---|---|---|---|
| part_ids | No | Explicit part selection set. Implies part_scope explicit. Mutually exclusive with part_filter. | |
| objective | No | ||
| tal_label | Yes | ||
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| build_mode | No | ||
| dwell_time | No | ||
| part_layer | Yes | ||
| part_scope | No | Parts eligible for partition. Default bbox_intersect: all parts intersecting the account-point bounding box. point_matched: only parts containing at least one account; those parts are rarely adjacent, so territories come back as scattered pieces (warning POINT_MATCHED_SPARSE_SCOPE) — use it only when that is the goal. explicit: part_ids or part_filter (e.g. state_abbr TX). | |
| output_mode | No | tal is the default. assignments returns assignments_artifact plus an authenticated download_url and a key-less share_url; no ts_handle, tal_id, or map_refresh. | tal |
| part_filter | No | Attribute filter resolved via query_parts (e.g. {"state_abbr": "TX"}). Implies part_scope explicit. Mutually exclusive with part_ids. | |
| point_layer | Yes | ||
| repair_policy | No | Topology repair for dissolved territories. default fills interior holes in the dissolved geometry (no part is added or reassigned; repair_summary.changed_part_ids lists the territories' own parts). report_only detects holes and changes nothing (warning REPAIR_AVAILABLE). strict fails with REPAIR_REQUIRED when a hole is found. | default |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| expected_revision | No | ||
| visit_frequency_field | No | Point column that scales territory workload by visits per cycle. Mutually exclusive with ignore_visit_frequency. Required as use-or-ignore when the point layer declares a visit-frequency column. | |
| ignore_visit_frequency | No | When true, every account is one visit per cycle. Mutually exclusive with visit_frequency_field. Required as the ignore choice when the point layer declares a visit-frequency column. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
calculate_routeCalculate RouteAInspect
Sequences and drives a set of stops, e.g. a technician from home to the depot, then the day's calls, and back home: returns the order, road distance, drive time, per-leg timings, and geometry from TomTom or Azure Maps, and draws the path with numbered stops on the open map (map_session_id). Creates no territory and changes no assignment. route_type is the user's choice: circuit (returns to start), tour (ends at the required end stop), or open_tour (one way). stop_sets are visited in the order given and no stop moves between sets; order is optimize or as_given; group_by_field adds priority bands. Stops are inline coordinates or point-layer references (e.g. source.filter.territory_id); point_ids and stop_id are point_id values (visits: <account_id>#). A new route_id adds a second route; recalculating an existing route_id replaces it, e.g. to drop a stop. dwell_time is stored for analyze_routes. Route drive time is a different measure from territory workload. No provider key returns ROUTING_NOT_CONFIGURED; past the monthly quota, PROVIDER_QUOTA_EXCEEDED. Returns a task.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Destination. Required for route_type=tour, rejected otherwise. | |
| start | Yes | Origin. Must resolve to exactly one stop. | |
| route_id | No | Stable identity for the route inside the solution. A new route_id adds a route alongside the existing ones; reusing a route_id replaces that route in place. To add or drop a stop, call again with the SAME route_id and the revised stop list — there is no add-stop tool and delete_route is for dropping the whole route. Defaults to a slug of route_label, else a generated id. | |
| depart_at | No | RFC 3339 departure time. Drives traffic-aware durations. Defaults to now. | |
| stop_sets | Yes | ||
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| dwell_time | No | ||
| route_type | No | circuit returns to start; tour finishes at the declared end (required); open_tour lets the optimizer choose the final stop and never returns to start. | |
| route_label | No | Display name for the route on the map and in the legend. Seeds route_id when route_id is omitted. | |
| travel_mode | No | car | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| include_geometry | No | Set false to skip the route polyline when only sequence and timings are needed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
cluster_pointsCluster PointsAInspect
Groups the points of one ingested layer into balanced clusters directly, with no ZIP or part layer and no territory alignment. Writes group_field (default group_id) on every point and colors the layer by it, replacing any prior color classification (size and shape channels stay). Needs build_mode (fixed_territory_count or fixed_workload_target), objective, and dwell_time, as in auto_build; a missing one returns CLARIFICATION_REQUIRED with the question. point_filter (e.g. {STATE: FL}) clusters a subset of the layer; unmatched points stay, ungrouped. Max 25,000 points after the filter. seed_point_layer, a second point layer such as technician homes, anchors one group per seed (the seed count matches the group count, else seed_count_mismatch); seed_attraction 0-100 (default 70) is the pull of each seed on its group. Returns a task; the result lists groups with point_count, workload_hours, and point_ids.
| Name | Required | Description | Default |
|---|---|---|---|
| objective | No | ||
| point_ids | No | Optional point_id / row_id / account_id values to cluster. Unmatched points stay on the layer ungrouped. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| build_mode | No | ||
| dwell_time | No | ||
| group_field | No | group_id | |
| point_layer | Yes | ||
| point_filter | No | Optional property filter on the named point layer. Keys are point properties (equality or IN list). Multiple keys are AND. Example: {"STATE": "FL"}. Unmatched points stay on the layer ungrouped. part_filter and part_scope are not used here. | |
| metric_fields | No | Metric columns to declare on the point layer (same shape as ingest_accounts metric_fields). | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| seed_attraction | No | How hard each group centroid is held at its seed. 100 pins it at the seed; 0 seeds only the starting point and lets the solver drift to the workload centroid. Requires seed_point_layer. | |
| seed_point_layer | No | Second ingested point layer whose locations anchor the group centroids one-to-one (technician homes, depots). Must differ from point_layer; its point count must equal the group count. | |
| expected_revision | No | ||
| group_label_prefix | No | Group | |
| visit_frequency_field | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
configure_mapConfigure MapAInspect
Updates map settings on the Territory Solution and refreshes the live map: project_name (map heading), theme (dark | light basemap and UI style), loaded_part_layers ([] hides ZIP/part outlines; builds never load them), active_part_layer, active_tal_id, center and zoom (default view; the live map jumps there), and point symbology. point_layer_classifications entries are {point_layer, field, method: quantile | equal_interval | categorical | manual, class_count 2-12, channel: color | size | shape, optional colors/sizes/shapes/style}; the server computes the breaks and returns per-class counts. One classification per channel per layer; clear:true removes one. Shapes include circle, square, triangle, diamond, star, cross, house, pin, flag, hexagon, pentagon, shield, arrow_up, building, person. classification without point_layer is a project-level setting that does not color points. Input: map_session_id (the live map) or ts_handle.
| Name | Required | Description | Default |
|---|---|---|---|
| zoom | No | Default MapLibre zoom (0-24). Persists to map_config.zoom. An open MC jumps when this request includes center and/or zoom. | |
| theme | No | Map Component basemap and UI theme ('dark' or 'light'; default 'dark'). Persists to ts.properties.map_config.theme and repaints the open map session live. | |
| center | No | Default camera center as GeoJSON/MapLibre [longitude, latitude]. Persists to map_config.center. An open MC jumps when this request includes center and/or zoom; later config_changed events without those fields leave the camera where it is. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| presentation | No | Named presentation context stored on map_config and restored when the TS opens. | |
| project_name | No | First-class Territory Solution short name shown as the Map Component panel title. Persists to ts.properties.map_config.project_name; when an MC session is open for this TS, configure_map pushes config_changed so the title refreshes without reopening the map. | |
| active_tal_id | No | Durable active alignment restored when the Territory Solution opens. | |
| classification | No | Project-level map_config classification (e.g. primary metric context for selection-impact preview). It leaves point colors unchanged; a patch naming a point_layer is routed to point_layer_classifications with a warning. | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| merge_strategy | No | ||
| active_part_layer | No | ||
| expected_revision | No | ||
| loaded_part_layers | No | ||
| expected_content_hash | No | ||
| point_layer_classifications | No | Applied point-layer symbology. The server computes breaks from the in-session point features, writes ts.properties.point_layers[].<channel>_classification, and pushes config_changed so an open MC repaints. One entry per layer/channel. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
create_territory_from_partsCreate Territory from PartsAInspect
Creates one leaf territory from a list of part_ids (e.g. a committed map selection), in a new alignment or an existing one (tal_id). With map_session_id the live map's Territory Solution is updated and repainted; otherwise ts_handle (a new ts_handle is returned). map_session_id wins when both are passed. territory_name is a display label; the result's created_territory.territory_id is the stable id for later edits, plus leaf_territories and selection_summary (duplicate_part_ids). Dwell is optional here and is not inherited from an earlier auto_build; dwell_time is recorded for later analyze. Without it, analyze reports every statistic except workload and returns workload_omitted.ask_user. Returns a task.
| Name | Required | Description | Default |
|---|---|---|---|
| tal_id | No | Existing TAL to append the new territory to; omit to start a new alignment. | |
| part_ids | Yes | Parts for the new territory, e.g. committed part_ids from get_part_selection. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| dwell_time | No | ||
| part_layer | Yes | ||
| repair_policy | No | Topology repair policy for dissolved geometry (default, strict, or report_only). Interior holes occupied by existing territories in the TS are never filled. | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| territory_name | Yes | ||
| territory_path | No | ||
| conflict_policy | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
delete_point_layerDelete Point LayerADestructiveInspect
Point-layer delete: removes one point layer and its account points from the Territory Solution and the open map, in one synchronous call. Needs point_layer (the layer id or its exact unique label), plus map_session_id or ts_handle. Territories, part overlays, and other point layers stay. A layer that is already gone returns ok with already_absent=true; an ambiguous label returns AMBIGUOUS_POINT_LAYER with matching_point_layers. ingest_accounts does not replace an existing layer; delete it here first. A visit layer derived from the deleted layer is reported and kept.
| Name | Required | Description | Default |
|---|---|---|---|
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| point_layer | Yes | Point layer to delete: the point_layer id, or an exact unique layer label. | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
delete_routeDelete RouteADestructiveInspect
Route delete: removes one whole route from the Territory Solution and the open map, in one synchronous call. Needs route_id or the route's exact unique label, plus map_session_id or ts_handle. A route that is already gone returns ok with already_absent=true; an ambiguous label returns AMBIGUOUS_ROUTE with matching_route_ids. A single stop is removed by recalculating the same route_id with calculate_route.
| Name | Required | Description | Default |
|---|---|---|---|
| route_id | Yes | Route to delete: the route_id, or an exact unique route label. Removing one stop is a calculate_route with the same route_id and the remaining stops. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
delete_talDelete AlignmentADestructiveInspect
Deletes one whole territory alignment (TAL: 'the territory layer', 'all territories') from the Territory Solution and the open map, in one synchronous call. Needs tal_id or the TAL's exact unique label, plus map_session_id or ts_handle. Points, part-layer overlays, and routes stay; the map switches to a remaining alignment or to points only. A TAL that is already gone returns ok with already_absent=true; an ambiguous label returns AMBIGUOUS_TAL. One territory is removed with delete_territory instead.
| Name | Required | Description | Default |
|---|---|---|---|
| tal_id | Yes | Territory layer / alignment to delete: tal_id or an exact unique TAL label. Removes the whole layer in one call (users say territory layer / all territories / alignment more often than TAL). One leaf is removed with delete_territory. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
delete_territoryDelete TerritoryADestructiveInspect
Deletes one leaf territory from an alignment; its parts become unassigned. Needs tal_id, territory_id (the leaf id or its exact unique display name), and the Territory Solution from map_session_id or ts_handle. A territory that is already gone returns ok with already_absent=true and no task; otherwise returns a task and the open map repaints. Related: territory_merge hands a leaving rep's territory to its neighbors; delete_tal removes a whole alignment in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| tal_id | Yes | Target TAL containing the leaf to delete. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| part_layer | No | Part layer name when not inferable from the TAL (e.g. us_zips). | |
| territory_id | Yes | Leaf territory_id (e.g. tal-t1-t1) or a unique display name/label alias (e.g. T1). | |
| repair_policy | No | Topology repair for dissolved territories. default fills interior holes in the dissolved geometry (no part is added or reassigned; repair_summary.changed_part_ids lists the territories' own parts). report_only detects holes and changes nothing (warning REPAIR_AVAILABLE). strict fails with REPAIR_REQUIRED when a hole is found. | default |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| expected_revision | No | Optional optimistic concurrency revision. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
direct_buildBuild Territories from AssignmentsAInspect
Builds territories from known part-to-territory assignments (a ZIP-to-territory sheet or file, including a three-level region/district/territory hierarchy via territory_path) and adds them to the Territory Solution as a new alignment (TAL). Assignments come only as an assignments_handle (aup_...) from request_assignment_upload (the file, csv_text, or assignment rows). Sheets with Postal Code plus Territory/Region/Division columns are mapped automatically. Duplicate part_ids follow duplicate_part_policy (default keep_first). Returns a task; the result carries tal_id and ts_handle and paints the open map. Location points load with ingest_accounts; balanced partitions come from auto_build; grouping by a column is account_build.
| Name | Required | Description | Default |
|---|---|---|---|
| tal_id | No | Optional caller-supplied TAL identifier. When omitted, the server derives a stable ID from tal_label. Supplied IDs must not collide with an existing TAL in the input TS. | |
| tal_label | Yes | ||
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| part_layer | Yes | ||
| repair_policy | No | Topology repair for dissolved territories. default fills interior holes in the dissolved geometry (no part is added or reassigned; repair_summary.changed_part_ids lists the territories' own parts). report_only detects holes and changes nothing (warning REPAIR_AVAILABLE). strict fails with REPAIR_REQUIRED when a hole is found. | default |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| expected_revision | No | ||
| assignments_handle | No | Required. upload_handle (aup_...) from request_assignment_upload. Single-use: the build claims it. | |
| missing_part_policy | No | Controls assigned part IDs that are absent from the selected polygon part layer. fail returns UNKNOWN_PART_ID. drop_with_warning omits them, lists them in invalid_parts, and proceeds with geometry-covered assignments. | fail |
| duplicate_part_policy | No | When the same part_id maps to different territory_path values, keep_first (default) keeps the first row and skips the rest with a warning; keep_last keeps the last row; fail aborts with CLARIFICATION_REQUIRED. | keep_first |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
discover_intentDiscover Workflow IntentARead-onlyIdempotentInspect
Maps a free-text territory request to a workflow. Read-only keyword routing; no compute. Returns intent_category, the recommended tool order, the main tool (tier1_tool, null when the request is ambiguous) and alternatives, required_inputs, clarifying_questions for missing inputs, and the workflow guide inline as guidance {uri, title, excerpt}. Covers building territories (auto_build, account_build, direct_build, cluster_points, seed_build), editing (realign, split, merge, rebalance), analyze, geocoding and ingest, showing a ZIP or part layer, routes, drive-time areas (isochrone_build), recurring visit schedules (schedule_visits), contractor coverage gaps (analyze_network_coverage), listing points in a territory (points_in_territory), and moving a Territory Solution to or from EasyTerritory Designer.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional state flags that tailor the recommended workflow. | |
| user_request | Yes | The raw natural-language request to classify. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
ensure_map_viewerWait for Map ViewerARead-onlyIdempotentInspect
Reports whether the person has the map open (viewer_status.connected) for a map_session_id from get_map_visualization, waiting up to wait_seconds (max 30 s per call; the result reports requested_wait_seconds and max_wait_seconds). Works the same for the in-chat map and the map_url tab. Returns VIEWER_NOT_CONNECTED while the map is still closed; the same call can be repeated while the person opens it. Build, analyze, and selection results paint live once the viewer is connected.
| Name | Required | Description | Default |
|---|---|---|---|
| wait_seconds | No | Optional server-side wait window. 0 returns the current snapshot only. Values above 30 are clamped to 30 s per call; on VIEWER_NOT_CONNECTED the error details carry requested_wait_seconds, max_wait_seconds, and next_call (call again). | |
| map_session_id | Yes | Open map session (msess_...) from get_map_visualization. | |
| poll_interval_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
ep_graph_traverseTraverse Expert Pack LinksARead-onlyIdempotentInspect
Traverses the EMEP knowledge graph from a topic file (e.g. 'workflows/realign-by-selection.md') to related guidance, up to depth hops. Returns no edges unless the pack ships a _graph.yaml.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| file_path | Yes | ||
| edge_kinds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
ep_list_topicsList Expert Pack TopicsARead-onlyIdempotentInspect
Lists EMEP topics grouped by type (concept, workflow, interface, troubleshooting, decision). Optional type filter.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
ep_searchSearch Expert PackARead-onlyIdempotentInspect
Semantic search over the EZT MCP Expert Pack (EMEP): workflow guidance, concepts, interfaces, and common mistakes. Returns ranked markdown chunks with source files; atoms pulled in via requires are flagged requires_expanded. Degrades to the ezt://guidance/... resources if retrieval is unavailable. Examples: 'build balanced territories from accounts', 'viewer not connected before compute', 'auto_build vs account_build'.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| type | No | ||
| query | Yes | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
export_geojsonExport GeoJSONAInspect
Exports the territory solution as one GeoJSON file to share, archive, or open in EasyTerritory Designer: territory polygons with part_ids, points, and routes with numbered stops, each carrying its displayed style. tal_ids, point_layers, and route_layers narrow it; include_points / include_routes omit a family. Input: map_session_id, ts_handle, or a completed build job_id. Returns a task whose result is geojson_artifact, share_url (key-less browser download for one hour; give the user share_with_user), and download_url (GET with the API key), never an inline body. Both serve a plain .geojson file. import_geojson reopens the file.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No | task_id (same value as job_id) of a completed build or ingest task; its Territory Solution is the input. | |
| tal_ids | No | TALs to materialize; omit for all. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| point_layers | No | Point layers to include; omit for all. | |
| route_layers | No | route_id values to include; omit for all. Each exported route emits one route_path feature plus one route_stop feature per visit (never coalesced). | |
| include_points | No | ||
| include_routes | No | Set false to drop the whole route family regardless of route_layers. | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
extract_tal_branchExtract Alignment BranchAInspect
Extracts one regional branch of a hierarchical alignment (by branch_rollup_territory_id or branch_territory_path) into its own Territory Solution, so a delegate can edit just that region. Returns the extract plus branch_metadata, which reintegrate_branch needs later. exclude_locked (default true) leaves locked territories out.
| Name | Required | Description | Default |
|---|---|---|---|
| tal_id | Yes | Hierarchical TAL (alignment) to branch from. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| delegate_ref | No | ||
| exclude_locked | No | ||
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| expected_revision | No | ||
| branch_territory_path | No | ||
| expected_content_hash | No | ||
| branch_rollup_territory_id | No | Rollup territory whose subtree becomes the branch. Or pass branch_territory_path. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
eztEasyTerritory AssistantAInspect
Plain-language orchestrator: takes request (the goal) and runs the matching workflow in one call, optionally with csv_file (a host file parameter), accounts_handle, assignments_handle, map_session_id, or ts_handle. An uploaded CSV is parsed, staged, and ingested onto the open map. target_hours / workload_target map to a fixed-workload auto_build. Missing build inputs (part layer, alignment name, sizing, balance, dwell) return CLARIFICATION_REQUIRED with the questions. The granular tools do the same steps individually.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | ||
| request | Yes | ||
| csv_file | No | Host file reference: an object with download_url (ChatGPT/OpenAI file param) or data (data: URI), or a URL / data: URI string. Local paths and bare file ids are rejected; for those, send the user to upload_url. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| state_facts | No | ||
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| accounts_handle | No | upload_handle (aup_...) from request_account_upload. | |
| assignments_handle | No | upload_handle (aup_...) from request_assignment_upload. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
geocode_addressGeocode AddressesAInspect
Geocode-only pass: turns staged customer addresses into coordinates with match confidence, without loading a map layer. The rows are staged with request_account_upload (file, csv_text, or rows; up to 10,000 rows here) and passed as its upload_handle; the handle is not claimed, so ingest_accounts can load the same rows afterward. Accepts address/address_line1/street, city, state, and postal columns (common source headers are mapped). accept_suboptimal_geocodes=true accepts ZIP-centroid matches. Cached addresses are free; billable lookups count against a monthly per-key quota, and past it the result is PROVIDER_QUOTA_EXCEEDED with limit, used, remaining, and period_resets_at. Returns a task; the result has summary, sample_rows (10), failed_rows (first 50), a geocoded_rows_artifact with share_url for every row, and suggested_ingest. ingest_accounts alone also geocodes while it loads the map layer.
| Name | Required | Description | Default |
|---|---|---|---|
| use_cache | No | ||
| region_hint | No | ||
| country_hint | No | ||
| upload_handle | Yes | upload_handle (aup_...) from request_account_upload holding the address rows. Not claimed: ingest_accounts can reuse it. | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| min_confidence | No | ||
| force_regeocode | No | ||
| accept_suboptimal_geocodes | No | When true, accept suboptimal geocodes (e.g. ZIP centroids). Default false so geocode-only workflows surface NO_OPTIMAL_GEOCODE for human review. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
get_guidanceGet Startup GuidanceARead-onlyIdempotentInspect
Returns the EZT MCP operating guide: the cross-tool workflow order and shared rules (result.text, same text as the server instructions), result.server_version, and result.seat for the caller's key (plan standard|trial, key_expires_at, and quota_remaining for geocoding, routing, and isochrone requests). Read-only. Useful at the start of a session or for a host that does not show server instructions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
get_map_selectionGet Map SelectionARead-onlyIdempotentInspect
Returns the most recent committed selection on an open map session (map_session_id): part_layer, part_ids, and selection_task_id when the selection came from request_part_selection. Covers selections the person started from the map legend. realign takes these part_ids as moves with a leaf territory_id.
| Name | Required | Description | Default |
|---|---|---|---|
| map_session_id | Yes | Open map session (msess_...) from get_map_visualization. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
get_map_visualizationOpen MapAInspect
Opens the interactive territory map (Map Component) and returns map_url and map_session_id. Opens a blank map, or shows the latest state of an existing Territory Solution (e.g. yesterday's work) from ts_handle or a completed job_id. Idempotent per user_id: a second call returns the same map. new_project=true replaces the open workspace with an empty project. theme: dark | light (basemap and UI style; default dark). presentation.view_name: empty | points_only | review | selection. Apps-capable hosts render the map in chat (ui://easyterritory/map-viewer); other clients open map_url in a browser. Later map tools take map_session_id. ensure_map_viewer reports when the person has the map open.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | view — read-only map review/share/verification, no selection commits. select — allows transient local selection and committed selection events. | view |
| theme | No | Map Component basemap and UI theme ('dark' or 'light'; default 'dark'). | |
| job_id | No | task_id (same value as job_id) of a completed build or ingest task; its Territory Solution is the input. | |
| user_id | No | Stable caller id; a second call with the same user_id returns the same map. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| new_project | No | Start a fresh map session (session_exists=false) instead of reusing the caller's open workspace. Without ts, ts_handle, or job_id, opens an empty project; with a TS source, opens that Territory Solution on a new session without carrying over prior routes, overlays, or analysis panels. Omitted empty+view reuses the existing project. | |
| presentation | No | ||
| active_tal_id | No | Alignment to show as active. | |
| expiry_seconds | No | Requested session TTL in seconds. Server may cap at policy maximum. | |
| interaction_flags | No | Only meaningful in select mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
get_part_selectionGet Part SelectionARead-onlyIdempotentInspect
Returns the state of a map selection task (selection_task_id from request_part_selection, or active_selection_task_id in ezt://map-sessions/{id}/state): status awaiting_user_selection, committed, expired, or cancelled, and once committed the selected part_ids (with assigned and unassigned part_ids when a TAL is active). While awaiting, the response carries recommended_poll_delay_ms. Committed part_ids feed realign, create_territory_from_parts, or analyze.
| Name | Required | Description | Default |
|---|---|---|---|
| selection_task_id | Yes | selection_task_id (psel_...) from request_part_selection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
import_dataverse_viewImport Dynamics 365 ViewAInspect
Microsoft Copilot only (Entra sign-in): reads a Dynamics 365 account view server to server, as the signed-in user, and stages it as an account upload. No rows pass through the agent. view_id (or an exact view_name) comes from list_dataverse_views. The server adds accountid, name, and the address1 location columns to the view; they arrive as latitude, longitude, address, city, state, postal_code, country. Returns a task (follow next_action / sleep_ms, fetch the result once); the result is the same shape as an account upload: upload_handle, row_count, csv_headers, preview, upload_warnings, geocode_plan, and suggested_ingest. Confirm the column roles with the user, then ingest_accounts(**suggested_ingest.args). Limit 100,000 accounts (DATAVERSE_VIEW_TOO_LARGE). Other clients get DATAVERSE_NOT_AVAILABLE: use request_account_upload instead.
| Name | Required | Description | Default |
|---|---|---|---|
| view_id | No | Account view id from list_dataverse_views (system or personal). | |
| view_name | No | Exact view name, when view_id is unknown. Ambiguous names return DATAVERSE_VIEW_AMBIGUOUS. | |
| point_layer | No | Point layer name ingest_accounts will create. | accounts |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| environment_url | Yes | Dynamics 365 environment from list_dataverse_views. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
import_designer_projectImport Designer ProjectAInspect
Opens an EasyTerritory Designer project as a Territory Solution: the server exports it from Designer and imports it (territories with part_ids, point layers up to 250,000 features, routes). No file passes through the agent. Returns a task; the result has ts_handle and designer_warnings. With map_session_id the project replaces the open map's content. include_points / point_layers / include_routes / include_manual_polygons narrow it; part_layer forces the part layer. A Designer part layer is mapped to its EZT part layer id (listed in designer_warnings); one with no EZT match fails UNKNOWN_PART_LAYER with available_part_layers; retry with the user's choice as part_layer. Requires link_designer; project_id comes from list_designer_projects.
| Name | Required | Description | Default |
|---|---|---|---|
| part_layer | No | ||
| project_id | Yes | Designer project id from list_designer_projects. | |
| point_layers | No | ||
| include_points | No | ||
| include_routes | No | ||
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| include_manual_polygons | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
import_geojsonImport GeoJSONAInspect
Opens a GeoJSON FeatureCollection (points, or a territory file, plain or gzip/zip) as a Territory Solution; returns ts_handle and a summary. A file of any real size moves by reference, never inline: call with no file argument for an upload_url (give the user share_with_user, or POST it with curl_example), then poll import_geojson(upload_handle) every recommended_poll_delay_ms until upload_status=received. geojson_file takes a host file (download_url). Inline geojson / geojson_text / geojson_gzip take at most 256 KB; a larger one returns INLINE_PAYLOAD_TOO_LARGE with the upload_url call to make. Polygons without part_ids need part_layer + overlay_policy=centroid_within. For a Designer project, use import_designer_project.
| Name | Required | Description | Default |
|---|---|---|---|
| geojson | No | GeoJSON FeatureCollection: point features and/or EZT-exported territory features carrying part_ids. Incoming properties.style (color / opacity / size / shape / weight) on features and point_layers[] / route_layers[] is kept as-is; only missing paint is filled, so a reopened export paints exactly as saved (ts-reference.schema.json#/$defs/style). | |
| tal_label | No | Label for the imported TAL when territory features lack TAL metadata. | |
| part_layer | No | Geography for overlay assignment (e.g. us_zips). Required with overlay_policy. | |
| point_layer | No | Name for the imported point layer (default: points). | |
| geojson_file | No | Host file parameter (openai/fileParams): an object with a temporary https download_url, or that URL as a string. | |
| geojson_gzip | No | Base64 gzip or zip bytes of a GeoJSON FeatureCollection. | |
| geojson_text | No | ||
| upload_handle | No | Upload link handle from import_geojson() with no file argument; returns its upload_status. | |
| overlay_policy | No | Explicit opt-in for importing territory polygons without part_ids: assigns parts whose centroids fall inside each polygon. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
ingest_accountsIngest AccountsAInspect
Account ingest: loads account rows (CRM records, a CSV, a spreadsheet) as point data on a named point layer of the Territory Solution, to add them to the map, geocoding rows without coordinates. Rows come only as accounts_handle from request_account_upload (the user's file, csv_text, or rows; 100,000-row cap); its suggested_ingest carries these args. latitude/lat and longitude/lon/lng pass through; other names need latitude_field/longitude_field, and unused coordinate-like columns return CLARIFICATION_REQUIRED (needs_coordinate_fields). id_field is a unique key (default row_id); duplicates return needs_unique_row_id. Only declared columns are kept: metric_fields, workload_fields, dwell_time_field, visit_frequency_field, grouping_fields, display_fields, search_fields; to load a contractor list, layer_role=contractors adds trade_field, tier_field, capacity_field, service_zip_field (analyze_network_coverage). Later use of an undeclared column returns UNDECLARED_FIELD. Over geocode quota fails it whole. Returns a task with failed_rows and map_refresh.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Legend name for the point layer. Omitted: the point_layer id in title case (accounts is 'Accounts', schools_conus is 'Schools Conus'). | |
| id_field | No | Unique business key column. Duplicated label/name columns fail with blocked_by=needs_unique_row_id. With the default row_id and no unique column, the server synthesizes row-1, row-2, … when that column is absent. | row_id |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| use_cache | No | ||
| layer_role | No | contractors marks the supply side of a service network (contractor, vendor, service provider) for analyze_network_coverage. | |
| tier_field | No | Contractor column holding the network tier (e.g. Preferred). Retained like a declared column. | |
| label_field | No | label | |
| point_layer | No | accounts | |
| region_hint | No | ||
| trade_field | No | Contractor column naming the trade(s) served (e.g. HVAC; comma-separated for several). Retained like a declared column. | |
| country_hint | No | ||
| metric_fields | No | Agent-confirmed business metric columns (for example revenue, sales, units) to persist on point-layer metadata for downstream build/analyze tools. | |
| search_fields | No | Declared columns searchable in the Map Component. Undeclared columns are discarded at ingest and later operations on them fail with UNDECLARED_FIELD. | |
| capacity_field | No | Numeric contractor column holding capacity (e.g. jobs per month). Retained like a declared column. | |
| display_fields | No | Declared columns shown in Map Component point callouts. Undeclared columns are discarded at ingest and later operations on them fail with UNDECLARED_FIELD. | |
| latitude_field | No | Latitude column. Defaults accept case-insensitive GIS aliases latitude/lat (including LAT). Override for non-standard headers (e.g. Address 1: Latitude). Explicit values win over aliases. | latitude |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| min_confidence | No | ||
| accounts_handle | No | Required. upload_handle (aup_...) from request_account_upload. Single-use: ingest claims it. | |
| force_regeocode | No | When true, ignore existing coordinates and geocode addresses. Also confirms intentional address geocoding when unused numeric lat/lon-like columns are present (skips needs_coordinate_fields guard). | |
| grouping_fields | No | Declared columns used to group accounts (e.g. account_build grouping_field candidates). Declared fields are the retention contract: the compact TS keeps only id, coordinates, label, and declared fields; undeclared columns are discarded at ingest. | |
| longitude_field | No | Longitude column. Defaults accept case-insensitive GIS aliases longitude/lon/lng/long (including LON). Override for non-standard headers. Explicit values win over aliases. | longitude |
| workload_fields | No | ||
| dwell_time_field | No | Canonical per-account dwell column on point features. Pair with workload_fields unit metadata when values are in hours. | |
| replace_existing | No | When true, replaces an existing point layer with the same point_layer id in place. Default false returns POINT_LAYER_EXISTS when the layer already exists. | |
| service_zip_field | No | Contractor column listing served ZIPs, comma-separated, for coverage.rule=zip_list. Retained like a declared column. | |
| visit_frequency_field | No | Canonical numeric visits-per-cycle column on point features. Agent-resolved; MCP validates presence and persists on point-layer metadata. Without one, MCP defaults each account to one visit per cycle. | |
| accept_suboptimal_geocodes | No | When true (default for ingest), accept provider suboptimal geocodes (e.g. ZIP centroids) so address-only rows become points. Set false to require optimal/point-address matches only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
isochrone_buildBuild Drive-Time AreaAInspect
Draws the area reachable by driving from one or more origins within a time or distance budget (drive-time area, service area, catchment) and adds each area as a territory in a drive-time alignment. origins: inline {latitude, longitude} or a point-layer reference. bands: [{time_budget_seconds} or {distance_budget_meters}], one unit per call (MIXED_BUDGET_TYPES otherwise); one band gives one area per origin, several give nested areas. Limits: 25 origins, 5 bands, 6 hours, 500 km; travel_mode car or truck; depart_at supported. Areas are the provider polygons and may overlap; analyze counts accounts in every area containing them. realign/split/merge/rebalance return ISOCHRONE_TAL_NOT_EDITABLE. A band budget is not territory workload or route time. No provider key returns ISOCHRONE_NOT_CONFIGURED; the full call count is checked against the monthly quota first (PROVIDER_QUOTA_EXCEEDED). Returns a task.
| Name | Required | Description | Default |
|---|---|---|---|
| avoid | No | Road classes to keep out of the reachable area. Only values both providers document. | |
| bands | Yes | Budgets to draw at each origin. One band gives one leaf per origin; several give a rollup per origin with one leaf per band. Capped (default 5, TOO_MANY_BANDS). | |
| tal_id | No | Stable identity for the TAL. Reusing an existing id replaces that TAL. Defaults to a slug of tal_label. | |
| origins | Yes | Centers to measure reachability from. Provider calls are origins x bands, so this is capped (default 25, TOO_MANY_ORIGINS). | |
| traffic | No | Traffic-aware travel times. Ignored for a distance budget. | |
| depart_at | No | RFC 3339 departure time, which shapes traffic-aware boundaries. There is no arrive_at: reachable range is forward-only. | |
| tal_label | No | Display name for the TAL. Defaults to a readable summary, e.g. "20 min drive time". | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| route_type | No | fastest | |
| travel_mode | No | Narrower than calculate_route on purpose: neither provider offers a pedestrian or bicycle reachable range. | car |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
link_designerLink Designer AccountADestructiveInspect
Connects the customer's EasyTerritory Designer account so list_designer_projects, import_designer_project, and push_to_designer can call Designer from the server. Returns status linked (designer_origin, designer_user) or waiting_for_user with a link_url and share_with_user. The user pastes their Designer agent token (ezt_pat_...) on that page; the token is never a tool argument and never appears in a result. Repeated calls report the status; recommended_poll_delay_ms is the interval. unlink=true removes the stored link.
| Name | Required | Description | Default |
|---|---|---|---|
| unlink | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
list_dataverse_viewsList Dynamics 365 ViewsARead-onlyIdempotentInspect
Microsoft Copilot only (Entra sign-in): lists the Dynamics 365 account views the signed-in user can read, so their accounts import without a file. Without environment_url it lists the user's environments; with one environment it goes straight to its views, with several it returns status choose_environment and an ask_user. Views carry view_id, name, kind (system | personal), and is_default; point_readiness samples active accounts for coordinates vs address-only (address rows are geocoded at ingest). Next: import_dataverse_view(environment_url, view_id). Other clients get DATAVERSE_NOT_AVAILABLE: use request_account_upload (a CSV file) or list_designer_projects instead. DATAVERSE_CONSENT_REQUIRED carries admin_consent_url for the user's Microsoft admin.
| Name | Required | Description | Default |
|---|---|---|---|
| environment_url | No | Dynamics 365 environment, e.g. https://contoso.crm.dynamics.com; when absent the result lists environments. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
list_designer_projectsList Designer ProjectsARead-onlyIdempotentInspect
Lists the EasyTerritory Designer rolodex projects the linked Designer user can read: project_id, label, description, tags, saved_at, is_mine, and layers (point data present). q filters by text, tag by rolodex tag, mine=true to the user's own. project_id is the input to import_designer_project and push_to_designer. Without a link the error is DESIGNER_NOT_LINKED (see link_designer).
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | ||
| tag | No | ||
| mine | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
list_part_layersList Part LayersARead-onlyIdempotentInspect
Returns the available canonical part layers for territory construction (for example us_zips, us_counties, ca_fsa, and active country postal or administrative polygon layers), with the same metadata as ezt://part-layers: part_layer, label, description, country_codes, admin_levels, part_count, id_format, example_part_ids, capabilities, data_version, and updated_at. Optional part_layer returns detailed metadata for one layer (bbox, aliases, supported_admin1, source_name, source_vintage, id_format_notes) or UNKNOWN_PART_LAYER. Optional country_code filters by 2-letter ISO country code. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| part_layer | No | Optional canonical part layer identifier (for example us_zips, us_counties, ca_fsa, uk_areas, germany_postal) to fetch detailed metadata for one layer. | |
| country_code | No | Optional 2-letter ISO 3166-1 alpha-2 country code (for example US, CA, GB, DE) to filter the returned part layers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
load_analysis_panelLoad Analysis PanelAInspect
Shows a completed analyze result in the open map's analysis dock (single or compare). Needs map_session_id and the analyze task_id/job_id or the full analyze result (with tal_analyses and ts_identity; a partial object returns INVALID_REQUEST). presentation_mode: single, compare, executive, or diagnostic. dismiss=true hides the dock and keeps the statistics on the session. Changes nothing in the Territory Solution. analyze with analysis_panel=single fills the dock in the same call.
| Name | Required | Description | Default |
|---|---|---|---|
| roles | No | ||
| job_id | No | Compatibility alias for task_id. | |
| labels | No | ||
| dismiss | No | true hides the whole dock, header bar included, and keeps stored stats. It takes no analyses, task_id, labels, roles, or presentation_mode. | |
| task_id | No | Completed analyze task_id. Same string as job_id. Hydrates analyses when analyses is omitted. | |
| analyses | No | ||
| map_session_id | Yes | Open map session (msess_...) from get_map_visualization. | |
| presentation_mode | No | Panel mode. territory_metric_grid is default_presentation.view inside the Analyze result, not a presentation_mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
points_in_territoryPoints in TerritoryARead-onlyIdempotentInspect
Lists which account points from one point layer fall inside a territory polygon or a drive-time (isochrone) area. Per territory: point_count, metric_sums (metrics, else the layer's declared metric fields), and a sample of sample_size points (default 25, max 200; 500 across all territories) with label and metric fields, or only the fields you name. Counts and sums cover every inside point. The full list is never inline: it is in points_artifact, via download_url (GET with the API key) or share_with_user (one-hour key-less link for the user). Synchronous, read-only; needs map_session_id or ts_handle. territory_id names one leaf (id or unique display name), territory_ids several; omit both for every leaf in the TAL (tal_id, else the active or sole TAL). point_layer defaults to the sole layer with points; point_filter (e.g. {tier: 'Gold'}) filters before counting. A point counts in every containing polygon; overlaps lists shared points. Unknown ids return UNKNOWN_TAL_ID / UNKNOWN_TERRITORY_ID / UNKNOWN_POINT_LAYER with the available values.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Point properties to keep on sample points and in points_artifact. Omitted: the sample carries label plus the metric fields, and the artifact carries every property. | |
| tal_id | No | Territory alignment to query. Defaults to the active TAL, or the sole TAL with leaf polygons. | |
| metrics | No | Numeric point columns to sum per territory. Defaults to the layer's declared metric fields. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| point_layer | No | Point layer id or exact unique label. Optional when the solution has one layer with points. | |
| sample_size | No | Points shown inline per territory; the server lowers it so at most 500 sample points come back across all territories. point_count and metric_sums always cover every inside point; points_artifact lists them all. | |
| point_filter | No | Optional attribute filter (column -> value or list of values, matched case-insensitively, e.g. {"tier": "Gold"}) applied to the point layer before counting and listing. | |
| territory_id | No | One leaf: its stable territory_id or exact unique display name. Mutually exclusive with territory_ids. | |
| territory_ids | No | Several leaves (stable ids or exact unique display names). With neither territory_id nor territory_ids, every leaf in the TAL. | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
publish_to_dataversePublish Stamps to Dynamics 365ADestructiveInspect
Microsoft Copilot (Entra sign-in): writes stamped point-layer columns back to Dynamics 365 account records keyed by accountid (1:1 Account PATCH). Needs map_session_id or ts_handle. Point layers carry derived stamps from builds/realign (part_id, territory_id, territory_label), calculate_route (route_id, route_label, stop_sequence), schedule_visits (schedule_id, visit_count, schedule_days, schedule_dates, contractor_id, contractor_label), isochrone_build (isochrone_tal_id, isochrone_ids, isochrone_labels, isochrone_count), and cluster_points (group_id, group_label). A <point_layer>_visits layer resolves to its 1:1 parent account layer and maps schedule_day/date to schedule_days/dates. field_map maps point columns to Dynamics account logical attributes (primitive columns or territoryid / ownerid lookups resolved by name or GUID). With confirm=false (default) or no field_map, runs a read-only preflight returning status=confirmation_required, stamped_columns, candidate_target_attributes, preview_updates, and ask_user. With confirm=true, queues the batch PATCH task.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | False (default) runs the read-only preflight to preview matched accounts and validate attributes/lookups. True dispatches the batch PATCH job after user confirmation. | |
| field_map | No | Map of stamped point column -> Dynamics 365 account logical attribute name (e.g. {'territory_label': 'territoryid', 'route_label': 'new_routename'}). When absent, the preflight lists stamped_columns and candidate_target_attributes. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| point_layer | No | Source point layer in the Territory Solution (default 'accounts'). A <point_layer>_visits layer resolves to its 1:1 parent account layer. | accounts |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| environment_url | No | Dynamics 365 environment (e.g. https://contoso.crm.dynamics.com). Defaults to the environment the point layer was imported from, or the user's sole environment. | |
| include_unassigned | No | When true, accounts with an empty/unassigned stamp clear the target Dynamics attribute to null. Default false updates accounts with non-empty stamped values. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
push_to_designerSave to DesignerADestructiveInspect
Saves a Territory Solution in EasyTerritory Designer from the server. Without project_id it creates a new rolodex project named label (the user's choice; a missing label returns CLARIFICATION_REQUIRED). With project_id it overwrites that project's territories, points, and routes in place. Input: map_session_id, ts_handle, or a completed build job_id. Returns a task; the result has project_id, url, and share_with_user. part_layer_id binds the Designer catalog layer (default: the layer a pulled TAL came from); tal_id picks the alignment; include_points=false sends territories and routes only. Route stops link to point layers by point_id. run_plugin / push_power_bi (default false) run the project's post-save plugin / refresh Power BI. Requires link_designer.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | ||
| job_id | No | task_id (same value as job_id) of a completed build or ingest task; its Territory Solution is the input. | |
| tal_id | No | Alignment to push; defaults to the active TAL. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| project_id | No | Designer project to overwrite in place; omit to create a new project named label. | |
| run_plugin | No | ||
| part_layer_id | No | Designer catalog part layer to bind; defaults to the layer a pulled TAL came from. | |
| push_power_bi | No | ||
| include_points | No | ||
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
query_partsQuery Territory PartsARead-onlyIdempotentInspect
Returns attributes (no geometry) for parts of a part layer listed by list_part_layers or ezt://part-layers. Takes exactly one of filter (e.g. {state_abbr: TX}) or part_ids; neither or both returns INVALID_REQUEST. Paged with page_token. filter.territory {tal_id, territory_id} with ts_handle or map_session_id lists one territory's parts.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Attribute/text/range/spatial/territory filter. Mutually exclusive with top-level part_ids. | |
| part_ids | No | Explicit list of part IDs. Mutually exclusive with filter. Useful for validation or enrichment. | |
| page_token | No | Pagination token from a previous response. | |
| part_layer | Yes | Required part layer identifier, e.g. 'us_zips'. | |
| max_results | No | Maximum results per page. Server may enforce lower limits. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
realignRealign PartsADestructiveInspect
Moves ZIPs or other parts (typed ids or ones selected on the map) from one territory into another within one alignment (tal_id): a ZIP move. moves=[{part_id, to_territory_id}], or realign_operation with part_ids. The Territory Solution comes from map_session_id (the open map) or ts_handle; expected_revision adds optimistic concurrency (STALE_TS_REVISION when the map changed). to_territory_id is a leaf territory_id or that leaf's exact, unique display name; an unknown or ambiguous value returns UNKNOWN_TERRITORY_ID or AMBIGUOUS_TERRITORY with available_leaf_territories. A committed map selection is read with get_map_selection; request_part_selection lets the person pick parts on the map. remove_empty_territories drops leaves left with no parts. Returns a task; the open map repaints. analyze refreshes statistics when the map has account points.
| Name | Required | Description | Default |
|---|---|---|---|
| moves | No | ||
| tal_id | Yes | Target TAL to realign. Required — ambiguous TAL is an error. | |
| part_ids | No | Required for remove_parts operation. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| part_layer | No | Part layer name, e.g. us_zips, us_counties. Required when not inferable from the TAL. | |
| repair_policy | No | Topology repair for dissolved territories. default fills interior holes in the dissolved geometry (no part is added or reassigned; repair_summary.changed_part_ids lists the territories' own parts). report_only detects holes and changes nothing (warning REPAIR_AVAILABLE). strict fails with REPAIR_REQUIRED when a hole is found. | default |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| expected_revision | No | ||
| realign_operation | No | Realignment operation. Defaults to move_to_territory when moves[] is supplied. | |
| remove_empty_territories | No | When true with remove_parts, drop leaf territories that become empty. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
reintegrate_branchReintegrate Alignment BranchADestructiveInspect
Merges an edited branch (proposal Territory Solution from extract_tal_branch) back into the master. Needs branch_metadata and expected_master_revision; returns STALE_TS_REVISION when the master changed since the extract, in which case a fresh extract is needed. Merges apply one at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| branch_metadata | Yes | ||
| master_ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| proposal_ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| expected_master_revision | Yes | ||
| expected_master_content_hash | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
request_account_uploadRequest Account UploadAInspect
The one way account or address rows enter the server: stages them for ingest_accounts (accounts_handle) or geocode_address (upload_handle) and returns upload_handle, csv_headers, and suggested_ingest args with a geocode_plan. Ways in: the returned upload_url (no API key; valid up to 1 hour), which the user opens in a browser to drop a CSV or .xlsx (result.share_with_user; the path for a file the client cannot read, e.g. a SharePoint link) or a shell POSTs to (curl_example); csv_file (a host file parameter); csv_text (raw CSV, up to 25 MB per call); or rows chunks appended with upload_handle. A call with only upload_handle polls: upload_status waiting_for_file (sleep recommended_poll_delay_ms) or received, with preview (sample rows, column profile) and upload_warnings whose ask_user goes to the user before ingest. A local path in csv_file returns UNREADABLE_FILE_REFERENCE; an expired URL returns UPLOAD_TOKEN_EXPIRED and a call with upload_handle issues a new one. One handle holds at most 100,000 rows and is single-use, claimed by ingest_accounts, for 1 hour.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | ||
| csv_file | No | Host file reference: an object with download_url (ChatGPT/OpenAI file param) or data (data: URI), or a URL / data: URI string. Local paths and bare file ids are rejected; for those, send the user to upload_url. | |
| csv_text | No | ||
| ttl_seconds | No | ||
| upload_handle | No | Existing upload_handle (aup_...) to append this chunk of rows to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
request_assignment_uploadRequest Assignment UploadAInspect
The one way part-to-territory assignment rows (e.g. a ZIP-to-territory spreadsheet with Postal Code plus Territory/Region/Division) enter the server: stages them for direct_build (assignments_handle) and returns upload_handle. Same ways in as request_account_upload: upload_url (no API key; up to 1 hour; the user opens it in a browser to drop a CSV or .xlsx, or a shell POSTs the file), csv_file, csv_text (newlines preserved), or assignment chunks appended with upload_handle; poll with only upload_handle until upload_status is received. Legacy columns map to part_id and territory_path automatically. A file of locations rather than assignments is redirected to request_account_upload. The handle is single-use and expires after 1 hour by default.
| Name | Required | Description | Default |
|---|---|---|---|
| csv_file | No | Host file reference: an object with download_url (ChatGPT/OpenAI file param) or data (data: URI), or a URL / data: URI string. Local paths and bare file ids are rejected; for those, send the user to upload_url. | |
| csv_text | No | ||
| assignments | No | ||
| ttl_seconds | No | ||
| upload_handle | No | Existing upload_handle (aup_...) to append this chunk of rows to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
request_part_selectionRequest Part SelectionAInspect
Lets the person adjust boundaries by picking parts (e.g. ZIPs) on the map: puts the open map into select mode on a part_layer, for purpose realign, a new territory, or a plain list. Returns selection_task_id; get_part_selection reports status (awaiting_user_selection, then committed, expired, or cancelled) and the committed part_ids, and its response carries recommended_poll_delay_ms. The commit happens on the map, not in chat. destination_territory_id and realign_operation pre-set a realign. Works on the in-chat map and the map_url tab. map_session_id selects on the open map; ts_handle opens a stored Territory Solution first. A selection the person started from the map legend is read with get_map_selection.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | No | Human-facing selection instruction shown by the host/agent or MC. | |
| purpose | No | generic | |
| user_id | No | Stable caller id; finds the open map when map_session_id is omitted. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| part_layer | Yes | ||
| active_tal_id | No | Alignment shown as active while the person selects. | |
| new_territory | No | ||
| expiry_seconds | No | ||
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| realign_operation | No | ||
| destination_territory_id | No | Optional receiver leaf territory when Monica/agent named the destination up front. | |
| remove_empty_territories | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
schedule_visitsSchedule VisitsAInspect
Schedules recurring visits: expands each cadence (e.g. every 7 days) across a horizon and packs visits into daily buckets under a technician-day cap. Decides which day each visit happens (auto_build and cluster_points divide accounts among people); creates no alignment. Needs point_layer (ingested with cadence declared, else UNDECLARED_FIELD), visit_frequency_field, dwell_time, and daily_capacity ({mode: not_to_exceed, hours: 8}); missing dwell or capacity returns CLARIFICATION_REQUIRED. Omitted max_buckets_per_day means one technician per day; when one does not fit, CLARIFICATION_REQUIRED carries capacity_plan. estimate_only=true returns capacity_plan. contractors (point_layer or list: start, pre_service_stops, route_type, end) anchors buckets; unanchored one-stop days warn SINGLE_STOP_DAYS. frequency_unit: interval_days or visits_per_horizon. bucket_workload_hours (drive plus dwell) is a different measure from territory workload and route_workload_hours. Returns a task. calculate_route on one bucket_id drives that day. Date limits: visit_constraints with horizon_start_date.
| Name | Required | Description | Default |
|---|---|---|---|
| tal_id | No | Optional TAL id when filtering scheduled accounts by territory_id or territory_ids. | |
| horizon | No | Planning horizon. derived takes the longest interval among scheduled accounts; explicit is how a 28- or 42-day rolling cycle is requested when intervals leave a remainder on a shorter horizon. | |
| objective | No | Biases must sum to 100. Raising balance_bias to 100 lengthens otherwise efficient days to equalize hours, which is rarely what the customer wants. | |
| point_ids | No | Optional list of account/point IDs to schedule. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| dwell_time | No | ||
| contractors | No | Optional contractor anchoring (T-214). Takes a point-layer source (e.g. {point_layer: 'contractors'}) or a list of contractor entries with start, optional pre_service_stops (e.g. a depot with dwell_minutes), route_type (circuit|tour|open_tour), and optional end. | |
| point_layer | Yes | ||
| point_filter | No | Optional attribute filter (property -> value or list of values) to schedule a subset of point_layer. | |
| territory_id | No | Optional leaf territory id or unique display label to schedule only accounts inside that territory polygon. | |
| estimate_only | No | When true, runs a fast capacity-planning preflight without mutating the Territory Solution or emitting a visits layer, returning capacity_plan (open_service_days, closed_days, required_daily_hours_avg, peak_day_floor_hours, min_resources_per_day, recommended_resources_per_day, and remedies). | |
| territory_ids | No | Optional list of leaf territory ids or display labels to schedule only accounts inside those territory polygons. | |
| daily_capacity | No | Workload limit for one bucket (one technician-day). not_to_exceed is a hard ceiling the scheduler never breaches; target_band aims for the target and accepts anything inside the tolerance. | |
| frequency_unit | No | interval_days: the value is the maximum days between visits. visits_per_horizon: the value is how many visits the account gets across the whole horizon. | interval_days |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| schedule_label | No | ||
| emit_visit_layer | No | Materialize one point per scheduled visit so color-by-day and the calculate_route handoff are single calls. | |
| visit_layer_name | No | Defaults to <point_layer>_visits. This name is the schedule's identity: re-running with the same name replaces the layer in place, a different name adds a second schedule for comparison. | |
| expected_revision | No | ||
| visit_constraints | No | Separate account-keyed date-constraint dataset: blackouts/no-service windows, fixed dates, SLA due dates, anchor days, allowed weekdays. See visitConstraint. | |
| horizon_start_date | No | Calendar date of horizon day 1. Required when visit_constraints is non-empty; without it dated constraints return CLARIFICATION_REQUIRED (needs_horizon_start_date). There is no default of today. | |
| never_visit_values | No | Frequency values that mean the account is left off the schedule. Matching accounts are excluded and reported in excluded_accounts, never silently dropped. | |
| max_buckets_per_day | No | Cap on concurrent buckets in one day, normally the technician/contractor count (cannot exceed len(contractors) when contractors are supplied). Omitted with no contractors: one bucket per day; when that does not fit, CLARIFICATION_REQUIRED (blocked_by needs_technician_count) returns capacity_plan and asks how many technicians. | |
| visit_frequency_field | Yes | Numeric point column declared at ingest. Undeclared columns fail with UNDECLARED_FIELD. | |
| cadence_flexibility_pct | No | Percent of an account's own cadence a single visit may drift so the number of work clusters stays comparable day to day. At the default 15 a 14-day account may slide two days and a 7-day account one; a 3-day account does not move. Set to 0 for strict cadence. A drift past this tolerance happens only to staff a day that would otherwise be short of work — an idle technician costs more than a visit arriving a day early — and every relaxed visit is reported in distribution_summary.cadence_relaxation and the visits layer's cadence_drift_days column. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
seed_buildGrow Territory from SeedAInspect
Grows one territory outward from a seed {longitude, latitude} over a part layer until it holds a target: {type: location_count, value: N} or {type: metric_sum, field: , value: X}, counted from an ingested point layer. Adds the territory as a leaf of tal_id, or as a new alignment. Fit is closest: target_status is reached, closest_under, closest_over, frontier_exhausted, or max_parts_reached, with SEED_TARGET_UNDERSHOT/OVERSHOT warnings and the difference. Parts already in that alignment are never taken; the territory grows around them (blocked_part_count, seed_offset_km), and a seed inside an assigned part returns SEED_PART_ASSIGNED. part_scope=explicit with part_filter confines growth to an area. One seed per call. An undeclared metric field returns UNDECLARED_FIELD. Returns a task with created_territory and ts_handle; the open map repaints with map_session_id.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | Yes | Where growth starts. For an address or POI, stage it as one row with request_account_upload, then geocode_address(upload_handle); a map click already gives coordinates. | |
| tal_id | No | Existing TAL to append the new leaf to. Parts already assigned to any leaf of this TAL are never taken (the territory drifts instead). Without it, a new TAL is created. | |
| target | Yes | What the territory grows toward. Fit is closest: |achieved - value| is minimized, so the result may land slightly under or over. | |
| user_id | No | Stable per-user label for usage and queue ordering. | |
| part_ids | No | Explicit eligible part set. Implies part_scope explicit. Mutually exclusive with part_filter. | |
| max_parts | No | Safety cap on parts in the grown territory. Reaching it stops growth with target_status max_parts_reached. | |
| tal_label | No | Display name for the new TAL when tal_id is omitted. Ignored when tal_id is given. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| part_layer | No | Part layer to grow over, e.g. us_zips (ezt://part-layers). Required unless tal_id names a TAL that already has one; must match that TAL's layer when both are given. | |
| part_scope | No | Growth reads only the seed's neighbourhood (rings outward from the seed part), so this is an allowlist switch, not a performance prerequisite. explicit: confine growth to part_ids or part_filter (e.g. state_abbr TX) when the user wants the territory bounded by that geography. bbox_intersect / point_matched are accepted for compatibility with auto_build and ignored — seed_build never joins the whole point layer to the bbox parts. | |
| part_filter | No | Attribute filter resolved via query_parts (e.g. {"state_abbr": "TX"}). Implies part_scope explicit. Mutually exclusive with part_ids. | |
| point_layer | No | Ingested point layer whose locations are counted or summed. Required when the TS has more than one point layer. | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| territory_name | No | Display name for the new leaf. Defaults to the next free "Territory N" in the TAL. Must be unique within the TAL. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
set_map_stateSet Map StateARead-onlyIdempotentInspect
Changes the open map's session state: mode, active alignment (active_tal_id), pending job reference, or camera (center [longitude, latitude] and zoom 0-24). Session only: the Territory Solution is not changed (configure_map sets a durable default view). The result's render_ack is read at publish time, so sent_unconfirmed one version behind is normal; render_ack_hint says whether to reread ezt://map-sessions/{map_session_id}/state or resend. camera reports the view in effect and its source (requested, session, map_config, or viewer_current). A set camera stays until changed; switching alignment does not refit.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| zoom | No | ||
| center | No | ||
| active_tal_id | No | Alignment to make active on the open map (session only). | |
| map_session_id | Yes | Open map session (msess_...) from get_map_visualization. | |
| pending_job_reference | No | Task reference (task_id from a build submission) the map follows and repaints from when the task completes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
show_map_overlayShow Map OverlayAInspect
Shows or hides something on the open map from a plain request ('add US zip codes', 'hide the zips', 'show my accounts') or overlay_kind (part_layer, point_layer, tal, route) with overlay_id. Part layers load at a zoom where they are visible (visibility.camera_action); hiding a part layer leaves territories unchanged. Point layers must already be ingested; a layer in the Territory Solution but missing from the map is re-pushed (status=refreshed, with render_ack). Point layers have no hidden state: hide wording returns HIDE_NOT_SUPPORTED with do_this_next delete_point_layer, which removes the layer; the legend checkbox hides one in a single tab. route re-shows or hides routes calculate_route drew (route_id targets one); with no route yet it returns blocked_by=needs_route. When the user named a camera, do_this_next carries the configure_map call that sets it. Input: map_session_id (preferred) or ts_handle.
| Name | Required | Description | Default |
|---|---|---|---|
| route_id | No | With overlay_kind=route, targets one route instead of all of them. Without it, every route is re-pushed or cleared. Only re-shows or clears a route calculate_route already produced — it never routes. | |
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| overlay_id | No | Canonical id: us_zips, accounts, tal-current, etc. | |
| overlay_kind | No | ||
| user_request | No | Natural-language ask, e.g. 'add zips to the map'. | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| merge_strategy | No | ||
| expected_revision | No | ||
| expected_content_hash | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
submit_feedbackSubmit FeedbackAInspect
Sends product feedback to EasyTerritory: a blocked or partial workflow, a workaround, a confusing response, or a missing capability. Returns an acknowledgement with feedback_id. Secrets, emails, Territory Solution JSON, GeoJSON, and account/CSV tables are stripped before storage; the text is meant for a description of what happened, not data.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | other | |
| severity | No | medium | |
| user_goal | Yes | What the user was trying to accomplish, sanitized. | |
| confidence | No | medium | |
| session_id | No | Client session id, if the host has one. | |
| client_name | No | ||
| related_tool | No | ||
| what_happened | Yes | Where the agent struggled, failed, found confusing results, or used a workaround. | |
| client_version | No | ||
| correlation_id | No | task_id, job_id, or request id the feedback is about. | |
| context_summary | No | Optional sanitized summary only. Excludes credentials, API keys, raw customer data, private territory assignments, and PII. | |
| include_context | No | ||
| expected_capability | No | ||
| related_product_area | No | ||
| suggested_improvement | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
tasks_cancelCancel TaskADestructiveInspect
Tool equivalent of the native MCP tasks/cancel, listed for clients without the Tasks capability. Requests cooperative cancellation of a task_id and returns the Task status document. Whether the Territory Solution is unchanged or partially updated follows the originating tool.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | task_id of the working task to stop. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ttl | No | |
| _meta | No | |
| phase | No | |
| status | No | |
| taskId | No | |
| progress | No | |
| sleep_ms | No | |
| terminal | No | |
| createdAt | No | |
| poll_loop | No | |
| next_action | No | |
| do_this_next | No | |
| next_poll_at | No | |
| pollInterval | No | |
| lastUpdatedAt | No | |
| source_status | No | |
| statusMessage | No | |
| recommended_poll_delay_ms | No |
tasks_getGet Task StatusARead-onlyIdempotentInspect
Tool equivalent of the native MCP tasks/get, listed for clients without the Tasks capability. Returns the Task status document for a task_id (holding up to wait_ms while the task is working). next_action is sleep_and_poll (wait sleep_ms, then one tasks_get), consume_result (one tasks_result call), or stop_error. status=cancelled means the user stopped it. While queued, _meta carries queue_position, queue_depth, queue_lane, and estimated_start_ms, which is advisory and not a wait time. Polling never starts work.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | task_id from the submitting tool's result (same value as job_id). | |
| wait_ms | No | Optional milliseconds to hold on the server while the task is working so completed tasks return consume_result without an extra poll round-trip. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ttl | No | |
| _meta | No | |
| phase | No | |
| status | No | |
| taskId | No | |
| progress | No | |
| sleep_ms | No | |
| terminal | No | |
| createdAt | No | |
| poll_loop | No | |
| next_action | No | |
| do_this_next | No | |
| next_poll_at | No | |
| pollInterval | No | |
| lastUpdatedAt | No | |
| source_status | No | |
| statusMessage | No | |
| recommended_poll_delay_ms | No |
tasks_resultGet Task ResultARead-onlyIdempotentInspect
Tool equivalent of the native MCP tasks/result, listed for clients without the Tasks capability. Returns the originating tool's terminal result once the task status is completed (consume_result): ts_handle, counts, timings, and map binding, never an inline Territory Solution. A build's ts_handle or task_id (as job_id) is the input analyze takes.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | task_id whose status next_action is consume_result. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
territory_mergeMerge TerritoriesADestructiveInspect
Merges a pair of adjacent territories (N to N-1 territories). By default, territory_id_b is folded into territory_id_a (or renamed to new_territory_label) and the rest of the alignment rebalances with minimal disruption, e.g. when a rep leaves and neighbors absorb the territory. Set preserve_other_territories=true for an exact two-territory union that combines only territory_id_a and territory_id_b (optionally named new_territory_label) and leaves every other territory unchanged with no rebalance. Non-adjacent ids return NON_ADJACENT_TERRITORIES. Needs source_tal_id and the Territory Solution from map_session_id or ts_handle; workload rebalance needs dwell_time (CLARIFICATION_REQUIRED otherwise). Writes a new derived alignment. Returns a task.
| Name | Required | Description | Default |
|---|---|---|---|
| objective | No | ||
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| dwell_time | No | ||
| part_layer | No | Part layer (e.g. us_zips). Required only when not inferable from the source TAL. | |
| point_layer | No | Optional point layer used to compute per-part workload/metric measures. When omitted, a uniform geography-only weighting is used. | |
| new_tal_label | No | Label for the derived TAL. Defaults to '<source label> (<operation>)'. | |
| repair_policy | No | Topology repair for dissolved territories. default fills interior holes in the dissolved geometry (no part is added or reassigned; repair_summary.changed_part_ids lists the territories' own parts). report_only detects holes and changes nothing (warning REPAIR_AVAILABLE). strict fails with REPAIR_REQUIRED when a hole is found. | default |
| source_tal_id | No | Source TAL. Optional for form-capable clients that can answer via elicitation. | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| territory_id_a | No | First territory (id or label). The merged territory keeps this identity unless new_territory_label is supplied. | |
| territory_id_b | No | Second territory (id or label). Must be adjacent to territory_id_a. | |
| balance_tolerance | No | Accepted for compatibility. The power-diagram rebalance converges on its own internal tolerance, so this value no longer gates per-part moves. | |
| disruption_weight | No | Incumbency stickiness for the warm-started power-diagram rebalance. 0 is a pure power re-solve (max balance, more churn); higher values keep more of the source alignment by requiring a neighbor territory to inflate further before it can claim a border part. | |
| new_territory_label | No | Optional display label for the merged territory (defaults to territory_id_a's label). | |
| visit_frequency_field | No | Numeric visits-per-cycle column on the point layer. When omitted, inherits from source TAL build_provenance or point-layer metadata. | |
| preserve_other_territories | No | When true, performs an exact union of territory_id_a and territory_id_b without rebalancing any other territory in the alignment. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
territory_rebalanceRebalance TerritoriesADestructiveInspect
Rebalances an existing alignment after the account data changed, keeping it as close to the current alignment as possible. Needs source_tal_id and the Territory Solution from map_session_id or ts_handle. point_layer defaults to the alignment's build layer or the only point layer; otherwise CLARIFICATION_REQUIRED (ambiguous_point_layer, with details.point_layers). Workload balance needs dwell_time; zero_workload means no account maps to a part. The current alignment is the baseline: when nothing improves the objective the result is NO_IMPROVING_REBALANCE_FOUND and nothing changes. Writes a new derived alignment. Returns a task with retention_pct and solver_diagnostics.
| Name | Required | Description | Default |
|---|---|---|---|
| objective | No | ||
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| dwell_time | No | ||
| part_layer | No | Part layer (e.g. us_zips). Required only when not inferable from the source TAL. | |
| point_layer | No | Optional point layer used to compute per-part workload/metric measures. When omitted, a uniform geography-only weighting is used. | |
| new_tal_label | No | Label for the derived TAL. Defaults to '<source label> (<operation>)'. | |
| repair_policy | No | Topology repair for dissolved territories. default fills interior holes in the dissolved geometry (no part is added or reassigned; repair_summary.changed_part_ids lists the territories' own parts). report_only detects holes and changes nothing (warning REPAIR_AVAILABLE). strict fails with REPAIR_REQUIRED when a hole is found. | default |
| source_tal_id | No | Source TAL. Optional for form-capable clients that can answer via elicitation. | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| balance_tolerance | No | Accepted for compatibility. The power-diagram rebalance converges on its own internal tolerance, so this value no longer gates per-part moves. | |
| disruption_weight | No | Incumbency stickiness for the warm-started power-diagram rebalance. 0 is a pure power re-solve (max balance, more churn); higher values keep more of the source alignment by requiring a neighbor territory to inflate further before it can claim a border part. | |
| visit_frequency_field | No | Numeric visits-per-cycle column on the point layer. When omitted, inherits from source TAL build_provenance or point-layer metadata. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
territory_splitSplit TerritoryADestructiveInspect
Territory split: divides one territory (e.g. an oversized one) into two while changing the rest of the alignment as little as possible (N to N+1 territories). Needs source_tal_id and target_territory_id, plus the Territory Solution from map_session_id (the open map) or ts_handle. Workload balance needs dwell_time; a missing id or dwell returns CLARIFICATION_REQUIRED with the question. Writes a new derived alignment; the source stays. Returns a task; the result carries disruption_summary (retention_pct).
| Name | Required | Description | Default |
|---|---|---|---|
| objective | No | ||
| ts_handle | No | Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline. | |
| dwell_time | No | ||
| part_layer | No | Part layer (e.g. us_zips). Required only when not inferable from the source TAL. | |
| point_layer | No | Optional point layer used to compute per-part workload/metric measures. When omitted, a uniform geography-only weighting is used. | |
| new_tal_label | No | Label for the derived TAL. Defaults to '<source label> (<operation>)'. | |
| repair_policy | No | Topology repair for dissolved territories. default fills interior holes in the dissolved geometry (no part is added or reassigned; repair_summary.changed_part_ids lists the territories' own parts). report_only detects holes and changes nothing (warning REPAIR_AVAILABLE). strict fails with REPAIR_REQUIRED when a hole is found. | default |
| source_tal_id | No | Source TAL. Optional for form-capable clients that can answer via elicitation. | |
| map_session_id | No | Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set. | |
| balance_tolerance | No | Accepted for compatibility. The power-diagram rebalance converges on its own internal tolerance, so this value no longer gates per-part moves. | |
| disruption_weight | No | Incumbency stickiness for the warm-started power-diagram rebalance. 0 is a pure power re-solve (max balance, more churn); higher values keep more of the source alignment by requiring a neighbor territory to inflate further before it can claim a border part. | |
| new_territory_label | No | Label for the second territory created by the split. Defaults to '<target> (split)'. | |
| target_territory_id | No | Leaf territory (id or label) to split into two. Optional when elicitation can fill it. | |
| visit_frequency_field | No | Numeric visits-per-cycle column on the point layer. When omitted, inherits from source TAL build_provenance or point-layer metadata. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields. |
| warnings | No |
workflow_advisorGet Next Workflow StepARead-onlyIdempotentInspect
Returns the next tool call for a multi-step workflow, given where the workflow stands. Read-only state machine; executes nothing. intent_category: build_from_accounts | account_grouping | known_assignments | realign_existing | restructure | load_part_layer | route_stops | reachable_area | periodic_scheduling | coverage_gap_analysis | points_in_territory. state: viewer_connected, point_layer, part_layer, tal_present, analysis_fresh, plus selection/realign or restructure flags. inputs: the values known so far (part_layer, territory_count, tal_id, operation, route_type, origins, visit_frequency_field, ...); missing_inputs names the keys still needed. Returns next_tool with drafted next_args, missing_inputs (reported, never invented), blocked_by, remaining_steps, and the workflow guide inline as guidance. Order rules applied: map before compute, viewer connected before compute, ingest before build, analyze after an edit when a point layer exists. Calling it after each step with the updated state walks the whole workflow.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Agent-supplied workflow state; all keys optional and default to 'not done yet'. | |
| inputs | No | Optional plan parameters used to draft next_args. | |
| intent_category | Yes | build_from_accounts | account_grouping | point_clustering | known_assignments | realign_existing | restructure | delete_territory | load_part_layer | reachable_area | seed_growth | coverage_gap_analysis | route_stops | routes_layer | delete_route | delete_point_layer | points_in_territory | periodic_scheduling. Tool names (auto_build, account_build, cluster_points, direct_build, isochrone_build, seed_build, analyze_network_coverage) are accepted as aliases; any other value returns the unsupported-category fallback. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | Present when ok is false. |
| result | No | Present when ok is true. |
| warnings | No |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
- Changed
auto_build3 fields changed- changed
Input schema / properties / build_mode / anyOfPrevious value: -[ - { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "fixed_territory_count" - }, - "territory_count": { - "minimum": 1, - "type": "integer" - } - }, - "required": [ - "mode", - "territory_count" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "cycle_unit": { - "enum": [ - "day", - "week", - "month", - "quarter", - "year" - ], - "type": "string" - }, - "mode": { - "const": "fixed_workload_target" - }, - "target_workload": { - "exclusiveMinimum": 0, - "type": "number" - }, - "workload_unit": { - "enum": [ - "minutes", - "hours" - ], - "type": "string" - } - }, - "required": [ - "mode", - "target_workload" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "scoped_split" - }, - "preserve_other_territories": { - "const": true, - "default": true - }, - "replacement_territory_count": { - "minimum": 2, - "type": "integer" - }, - "source_tal_id": { - "minLength": 1, - "type": "string" - }, - "source_territory_id": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "mode", - "source_tal_id", - "source_territory_id", - "replacement_territory_count" - ], - "type": "object" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Sizing mode: {mode: 'fixed_territory_count', territory_count: <int>} or {mode: 'fixed_workload_target', target_workload: <number>, workload_unit: 'hours'|'minutes', optional cycle_unit: 'day'|'week'|'month'|'quarter'|'year'} or {mode: 'scoped_split', source_tal_id: '<tal_id>', source_territory_id: '<territory_id>', replacement_territory_count: <int>=2.., optional preserve_other_territories: true}.", + "properties": { + "cycle_unit": { + "description": "Optional schedule cycle unit for fixed_workload_target.", + "enum": [ + "day", + "week", + "month", + "quarter", + "year" + ], + "type": "string" + }, + "mode": { + "description": "Sizing mode for the build.", + "enum": [ + "fixed_territory_count", + "fixed_workload_target", + "scoped_split" + ], + "type": "string" + }, + "preserve_other_territories": { + "default": true, + "description": "Keep all other territories in source_tal_id unchanged when mode='scoped_split'.", + "type": "boolean" + }, + "replacement_territory_count": { + "description": "Number of replacement territories (>=2) when mode='scoped_split'.", + "minimum": 2, + "type": "integer" + }, + "source_tal_id": { + "description": "Source TAL id when mode='scoped_split'.", + "minLength": 1, + "type": "string" + }, + "source_territory_id": { + "description": "Source territory id or label to split when mode='scoped_split'.", + "minLength": 1, + "type": "string" + }, + "target_workload": { + "description": "Target workload per territory when mode='fixed_workload_target'.", + "exclusiveMinimum": 0, + "type": "number" + }, + "territory_count": { + "description": "Target number of territories when mode='fixed_territory_count'.", + "minimum": 1, + "type": "integer" + }, + "workload_unit": { + "default": "hours", + "description": "Unit for target_workload ('hours' or 'minutes').", + "enum": [ + "minutes", + "hours" + ], + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Input schema / properties / build_mode / descriptionRemoved value: -"Required for execution unless a form-capable modern client answers sizing via Resolve/Elicit. Legacy/no-capability hosts still receive CLARIFICATION_REQUIRED when omitted." - added
Input schema / properties / build_mode / titleAdded value: +"Build Mode"
- Changed
calculate_route4 fields changed- added
Input schema / properties / route_type / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / route_type / defaultAdded value: +null - removed
Input schema / properties / route_type / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "route_type", - "start", - "stop_sets" -]New value: +[ + "start", + "stop_sets" +]
- Changed
cluster_points12 fields changed- changed
Input schema / properties / build_mode / anyOfPrevious value: -[ - { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "fixed_territory_count" - }, - "territory_count": { - "minimum": 1, - "type": "integer" - } - }, - "required": [ - "mode", - "territory_count" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "fixed_workload_target" - }, - "target_workload": { - "exclusiveMinimum": 0, - "type": "number" - }, - "workload_unit": { - "default": "hours", - "enum": [ - "minutes", - "hours" - ], - "type": "string" - } - }, - "required": [ - "mode", - "target_workload" - ], - "type": "object" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Sizing mode: {mode: 'fixed_territory_count', territory_count: <int>} or {mode: 'fixed_workload_target', target_workload: <number>, workload_unit: 'hours'|'minutes'}.", + "properties": { + "mode": { + "description": "Sizing mode for clustering.", + "enum": [ + "fixed_territory_count", + "fixed_workload_target" + ], + "type": "string" + }, + "target_workload": { + "description": "Target workload per group when mode='fixed_workload_target'.", + "exclusiveMinimum": 0, + "type": "number" + }, + "territory_count": { + "description": "Target number of groups when mode='fixed_territory_count'.", + "minimum": 1, + "type": "integer" + }, + "workload_unit": { + "default": "hours", + "description": "Unit for target_workload ('hours' or 'minutes').", + "enum": [ + "minutes", + "hours" + ], + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Input schema / properties / build_mode / descriptionRemoved value: -"Required unless modern form elicitation supplies sizing." - added
Input schema / properties / build_mode / titleAdded value: +"Build Mode" - added
Input schema / properties / point_idsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional point_id / row_id / account_id values to cluster. Unmatched points stay on the layer ungrouped.", + "title": "Point Ids" +} - changed
Output schema / properties / result / descriptionPrevious value: -"Present when ok is true."New value: +"Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields." - changed
Output schema / properties / result / properties / do_this_next / typePrevious value: -"string"New value: +[ + "object", + "string" +] - added
Output schema / properties / result / properties / job_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / next_actionAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / sleep_msAdded value: +{ + "type": "integer" +} - added
Output schema / properties / result / properties / statusAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / task_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / terminalAdded value: +{ + "type": "boolean" +}
- Changed
create_territory_from_parts2 fields changed- changed
Output schema / properties / result / descriptionPrevious value: -"Present when ok is true."New value: +"Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields." - added
Output schema / properties / result / propertiesAdded value: +{ + "do_this_next": { + "type": "object" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + } +}
- Changed
export_geojson2 fields changed- changed
Output schema / properties / result / descriptionPrevious value: -"Present when ok is true."New value: +"Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields." - added
Output schema / properties / result / propertiesAdded value: +{ + "do_this_next": { + "type": [ + "object", + "string" + ] + }, + "download_url": { + "type": "string" + }, + "exported_at": { + "type": "string" + }, + "feature_count": { + "type": "integer" + }, + "geojson_artifact": { + "type": "object" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "point_layers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "share_url": { + "type": "string" + }, + "share_url_expires_at": { + "type": "string" + }, + "share_with_user": { + "type": "string" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "tal_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "ts_identity": { + "type": "object" + } +}
- Changed
ezt2 fields changed- changed
Output schema / properties / result / descriptionPrevious value: -"Present when ok is true."New value: +"Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields." - added
Output schema / properties / result / propertiesAdded value: +{ + "do_this_next": { + "type": "object" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + } +}
- Changed
import_dataverse_view2 fields changed- changed
Output schema / properties / result / descriptionPrevious value: -"Present when ok is true."New value: +"Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields." - added
Output schema / properties / result / propertiesAdded value: +{ + "do_this_next": { + "type": "object" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + } +}
- Changed
import_designer_project2 fields changed- changed
Output schema / properties / result / descriptionPrevious value: -"Present when ok is true."New value: +"Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields." - added
Output schema / properties / result / propertiesAdded value: +{ + "do_this_next": { + "type": "object" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + } +}
- Changed
ingest_accounts1 field changed- added
Input schema / properties / replace_existingAdded value: +{ + "default": false, + "description": "When true, replaces an existing point layer with the same point_layer id in place. Default false returns POINT_LAYER_EXISTS when the layer already exists.", + "title": "Replace Existing", + "type": "boolean" +}
- Added
publish_to_dataverse - Changed
push_to_designer2 fields changed- changed
Output schema / properties / result / descriptionPrevious value: -"Present when ok is true."New value: +"Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields." - added
Output schema / properties / result / propertiesAdded value: +{ + "do_this_next": { + "type": "object" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + } +}
- Changed
schedule_visits8 fields changed- changed
Output schema / properties / result / descriptionPrevious value: -"Present when ok is true."New value: +"Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields." - changed
Output schema / properties / result / properties / do_this_next / typePrevious value: -"string"New value: +[ + "object", + "string" +] - added
Output schema / properties / result / properties / job_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / next_actionAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / sleep_msAdded value: +{ + "type": "integer" +} - added
Output schema / properties / result / properties / statusAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / task_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / terminalAdded value: +{ + "type": "boolean" +}
- Changed
territory_merge3 fields changed- added
Input schema / properties / new_territory_labelAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional display label for the merged territory (defaults to territory_id_a's label).", + "title": "New Territory Label" +} - added
Input schema / properties / preserve_other_territoriesAdded value: +{ + "default": false, + "description": "When true, performs an exact union of territory_id_a and territory_id_b without rebalancing any other territory in the alignment.", + "title": "Preserve Other Territories", + "type": "boolean" +} - changed
Input schema / properties / territory_id_a / descriptionPrevious value: -"First territory (id or label). The merged territory keeps this identity."New value: +"First territory (id or label). The merged territory keeps this identity unless new_territory_label is supplied."
2 tool updates
- Added
import_dataverse_view - Added
list_dataverse_views
3 tool updates
- Changed
auto_build1 field changed- changed
Input schema / properties / part_scope / descriptionPrevious value: -"Parts eligible for partition. Default bbox_intersect: all parts intersecting the account-point bounding box. point_matched: only parts containing at least one account. explicit: part_ids or part_filter (e.g. state_abbr TX)."New value: +"Parts eligible for partition. Default bbox_intersect: all parts intersecting the account-point bounding box. point_matched: only parts containing at least one account; those parts are rarely adjacent, so territories come back as scattered pieces (warning POINT_MATCHED_SPARSE_SCOPE) — use it only when that is the goal. explicit: part_ids or part_filter (e.g. state_abbr TX)."
- Changed
export_geojson1 field changed- removed
Input schema / properties / zipRemoved value: -{ - "default": true, - "description": "Default true stores/downloads gzip. Set false for uncompressed GeoJSON.", - "title": "Zip", - "type": "boolean" -}
- Changed
points_in_territory10 fields changed- added
Input schema / properties / fieldsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Point properties to keep on sample points and in points_artifact. Omitted: the sample carries label plus the metric fields, and the artifact carries every property.", + "title": "Fields" +} - removed
Input schema / properties / max_pointsRemoved value: -{ - "default": 1000, - "description": "Cap on points listed per territory. point_count and metric_sums always cover every inside point.", - "title": "Max Points", - "type": "integer" -} - added
Input schema / properties / sample_sizeAdded value: +{ + "default": 25, + "description": "Points shown inline per territory; the server lowers it so at most 500 sample points come back across all territories. point_count and metric_sums always cover every inside point; points_artifact lists them all.", + "title": "Sample Size", + "type": "integer" +} - added
Output schema / properties / result / properties / download_urlAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / points_artifactAdded value: +{ + "type": "object" +} - added
Output schema / properties / result / properties / sample_fieldsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / result / properties / sample_size_appliedAdded value: +{ + "type": "integer" +} - added
Output schema / properties / result / properties / share_urlAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / share_url_expires_atAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / share_with_userAdded value: +{ + "type": "string" +}
55 tool updates
- Changed
account_build16 fields changed- added
Input schema / properties / conflict_policy / descriptionAdded value: +"When accounts in one part map to multiple grouping labels, assign the part to the label with the highest account count; ties break by deterministic label sort." - added
Input schema / properties / grouping_field / descriptionAdded value: +"Point feature property treated as a grouping label even when numeric." - added
Input schema / properties / ignore_visit_frequency / descriptionAdded value: +"When true, every account is one visit per cycle. Mutually exclusive with visit_frequency_field." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - changed
Input schema / properties / part_filter / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "minProperties": 1, + "properties": { + "county_name": { + "type": [ + "string", + "array" + ] + }, + "part_layer": { + "type": "string" + }, + "population": { + "oneOf": [ + { + "type": "number" + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "between": { + "items": { + "type": "number" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "eq": { + "type": "number" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + }, + "spatial": { + "additionalProperties": false, + "oneOf": [ + { + "required": [ + "bbox" + ] + }, + { + "required": [ + "geometry" + ] + } + ], + "properties": { + "bbox": { + "description": "[min_lon, min_lat, max_lon, max_lat] in EPSG:4326.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "geometry": { + "description": "GeoJSON Polygon or MultiPolygon in EPSG:4326.", + "type": "object" + }, + "operator": { + "enum": [ + "intersects", + "within", + "contains" + ], + "type": "string" + } + }, + "required": [ + "operator" + ], + "type": "object" + }, + "state_abbr": { + "type": [ + "string", + "array" + ] + }, + "territory": { + "additionalProperties": false, + "oneOf": [ + { + "required": [ + "ts_handle" + ] + }, + { + "required": [ + "map_session_id" + ] + } + ], + "properties": { + "include_descendants": { + "default": true, + "description": "When true, rollup territories include descendant leaf territory part_ids.", + "type": "boolean" + }, + "map_session_id": { + "description": "Open map session whose Territory Solution holds the TAL.", + "minLength": 1, + "type": "string" + }, + "tal_id": { + "minLength": 1, + "type": "string" + }, + "territory_id": { + "minLength": 1, + "type": "string" + }, + "ts_handle": { + "description": "Territory Solution reference (tsh_...) holding the TAL (no inline TS).", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "tal_id", + "territory_id" + ], + "type": "object" + }, + "text": { + "additionalProperties": false, + "properties": { + "case_sensitive": { + "default": false, + "type": "boolean" + }, + "field": { + "description": "Safe text field to search. Defaults to the public part ID column.", + "type": "string" + }, + "mode": { + "default": "prefix", + "enum": [ + "prefix", + "contains", + "exact" + ], + "type": "string" + }, + "value": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / part_filter / descriptionAdded value: +"Attribute filter resolved via query_parts (e.g. {\"state_abbr\": [\"FL\", \"GA\"]}). Implies part_scope explicit. Mutually exclusive with part_ids." - removed
Input schema / properties / part_filter / titleRemoved value: -"Part Filter" - added
Input schema / properties / part_ids / descriptionAdded value: +"Explicit part selection set. Implies part_scope explicit. Mutually exclusive with part_filter." - added
Input schema / properties / part_scope / descriptionAdded value: +"Parts eligible for Account Build geography. Default bbox_intersect: all parts intersecting the account-point bounding box. point_matched: only parts containing at least one account (radial seeds only; no FCFS inflate). explicit: part_ids or part_filter (e.g. state_abbr FL). Scope fill uses FCFS adjacency inflate from cluster radial seeds, not national nearest-anchor fill." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - added
Input schema / properties / visit_frequency_field / descriptionAdded value: +"Point column that scales territory workload by visits per cycle. Mutually exclusive with ignore_visit_frequency." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields.", + "properties": { + "assignment_count": { + "type": "integer" + }, + "assignment_summary": { + "type": "object" + }, + "assignments_artifact": { + "type": "object" + }, + "conflict_summary": { + "type": "object" + }, + "do_this_next": { + "type": [ + "object", + "string" + ] + }, + "download_url": { + "type": "string" + }, + "expires_at": { + "type": "string" + }, + "group_count": { + "type": "integer" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "output_mode": { + "type": "string" + }, + "part_scope_summary": { + "type": "object" + }, + "phase_timings_ms": { + "type": "object" + }, + "repair_summary": { + "type": "object" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "tal_id": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "ts_handle": { + "type": "string" + }, + "ts_identity": { + "type": "object" + }, + "ts_omitted": { + "type": "object" + }, + "unassigned_account_summary": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"account_buildDictOutput"
- Changed
analyze20 fields changed- added
Input schema / properties / compare_tals / descriptionAdded value: +"When true and multiple tal_ids supplied, include a cross-TAL comparison section." - changed
Input schema / properties / hypothetical_moves / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": false, + "properties": { + "from_territory_id": { + "type": "string" + }, + "part_id": { + "minLength": 1, + "type": "string" + }, + "to_territory_id": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "part_id", + "to_territory_id" + ], + "title": "Hypothetical Part-Move for Impact Analysis", + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / hypothetical_moves / descriptionAdded value: +"Optional. Compute impact of these hypothetical part moves without persisting any change." - removed
Input schema / properties / hypothetical_moves / titleRemoved value: -"Hypothetical Moves" - added
Input schema / properties / job_id / descriptionAdded value: +"task_id (same value as job_id) of a completed build or ingest task; its Territory Solution is the input." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / max_depth / descriptionAdded value: +"Optional. For hierarchical TALs, return rollup metrics only up to this depth level. Without it, every level is returned." - added
Input schema / properties / metrics / descriptionAdded value: +"Data field names to aggregate per territory. If omitted, server returns all available metrics." - added
Input schema / properties / part_layer / descriptionAdded value: +"Part layer name. Required when not inferable from the TAL(s). Not used for a drive-time (isochrone) TAL, which is measured by polygon." - changed
Input schema / properties / scope / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "part_ids": { + "description": "Restrict analysis to these part IDs, e.g. a map selection.", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "territory_ids": { + "description": "Restrict analysis to these territory IDs within each TAL.", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + } + }, + "title": "Optional Scope Constraint", + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / scope / descriptionAdded value: +"Optional — restrict analysis to a subset of parts or territories." - removed
Input schema / properties / scope / titleRemoved value: -"Scope" - added
Input schema / properties / tal_ids / descriptionAdded value: +"TAL IDs to analyze. Defaults to the active TAL when unambiguous." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - added
Input schema / properties / visit_frequency_field / descriptionAdded value: +"Optional visit-frequency point column override for workload recompute." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields.", + "properties": { + "analysis_panel": { + "type": "object" + }, + "caveats": { + "items": { + "type": "string" + }, + "type": "array" + }, + "cross_tal_comparison": { + "type": "object" + }, + "default_presentation": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "hypothetical_impact": { + "type": "object" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "presentation_guidance_uri": { + "type": "string" + }, + "scoped_aggregates": { + "type": "object" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "tal_analyses": { + "items": { + "type": "object" + }, + "type": "array" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "territory_metric_grids": { + "items": { + "type": "object" + }, + "type": "array" + }, + "ts_identity": { + "type": "object" + }, + "workload_omitted": { + "type": "object" + }, + "workload_units": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"analyzeDictOutput"
- Changed
analyze_network_coverage24 fields changed- added
Input schema / properties / capacity_field / descriptionAdded value: +"Overrides the contractor layer's capacity_field. Enables capacity_ratio." - changed
Input schema / properties / contractor_filter / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": { + "anyOf": [ + { + "type": [ + "string", + "number", + "boolean" + ] + }, + { + "items": { + "type": [ + "string", + "number", + "boolean" + ] + }, + "minItems": 1, + "type": "array" + } + ] + }, + "minProperties": 1, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / contractor_filter / descriptionAdded value: +"Column -> value (or list of values), e.g. {\"tier\": \"Preferred\"}. The key tier maps to tier_field when the layer has no literal tier column." - removed
Input schema / properties / contractor_filter / titleRemoved value: -"Contractor Filter" - added
Input schema / properties / contractor_layer / descriptionAdded value: +"Point layer of contractors. Defaults to the only layer ingested with layer_role=contractors; otherwise CLARIFICATION_REQUIRED (needs_contractor_layer)." - changed
Input schema / properties / coverage / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "isochrone_tal_id": { + "minLength": 1, + "type": "string" + }, + "max_km": { + "exclusiveMinimum": 0, + "type": "number" + }, + "max_minutes": { + "exclusiveMinimum": 0, + "type": "number" + }, + "part_layer": { + "default": "us_zips", + "description": "Part layer the demand points are placed in for zip_list and gap_territory.", + "minLength": 1, + "type": "string" + }, + "rule": { + "enum": [ + "drive_time", + "zip_list" + ], + "type": "string" + }, + "source": { + "default": "travel_model", + "enum": [ + "travel_model", + "isochrone_tal" + ], + "type": "string" + } + }, + "required": [ + "rule" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / coverage / descriptionAdded value: +"What counts as covered. drive_time with source travel_model (default) needs max_minutes or max_km and uses the calibrated quadkey detour-factor model with CONSTITUTION speed-curve fallback (no provider calls). drive_time with source isochrone_tal needs isochrone_tal_id: a point is covered by a contractor when one of that contractor's isochrone_build polygons contains it (origin_id = contractor id); max_minutes, when given, drops wider time bands. zip_list uses each contractor's service_zip_field." - removed
Input schema / properties / coverage / titleRemoved value: -"Coverage" - added
Input schema / properties / demand_layer / descriptionAdded value: +"Point layer of demand (customers, claims, stores, or ZIP centers). Defaults to the only other ingested layer." - added
Input schema / properties / demand_metric / descriptionAdded value: +"Numeric demand column (e.g. request count). Defaults to 1 per point; non-numeric cells count as 0 with warning DEMAND_METRIC_MISSING." - added
Input schema / properties / gap_territory / descriptionAdded value: +"Also draw ZIPs whose demand is all uncovered as one territory in a new TAL." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / priority_weights / descriptionAdded value: +"gap_priority weights; defaults demand 0.6, distance 0.4, single_source_factor 0.5. The formula is echoed in result.priority_formula." - added
Input schema / properties / saturation_threshold / descriptionAdded value: +"Contractor count at which a point is saturated (blue)." - added
Input schema / properties / service_zip_field / descriptionAdded value: +"Overrides the contractor layer's service_zip_field (required for zip_list)." - added
Input schema / properties / tier_field / descriptionAdded value: +"Overrides the contractor layer's tier_field." - added
Input schema / properties / trade / descriptionAdded value: +"One trade per call, matched case-insensitively against the comma-separated trade_field values. '*' (or 'all') keeps every contractor. Required when the contractor layer has a trade_field (needs_trade)." - added
Input schema / properties / trade_field / descriptionAdded value: +"Overrides the contractor layer's trade_field." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "created_at": { + "type": "string" + }, + "do_this_next": { + "type": "object" + }, + "estimated_remaining_ms": { + "type": "integer" + }, + "estimated_start_ms": { + "type": "integer" + }, + "expires_at": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "next_poll_at": { + "type": "string" + }, + "phase": { + "type": "string" + }, + "poll_interval_ms": { + "type": "integer" + }, + "poll_loop": { + "type": "object" + }, + "progress": { + "type": "number" + }, + "queue_depth": { + "type": "integer" + }, + "queue_lane": {}, + "queue_position": { + "type": "integer" + }, + "recommended_poll_delay_ms": { + "type": "integer" + }, + "required_input": { + "type": "object" + }, + "result_resource_uri": { + "type": "string" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "status_resource_uri": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "tool_name": { + "type": "string" + }, + "total": { + "type": [ + "null", + "number" + ] + }, + "user_cancelled": { + "type": "boolean" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"analyze_network_coverageDictOutput"
- Changed
analyze_routes7 fields changed- added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / route_ids / descriptionAdded value: +"Routes to report on, in the order returned. Absent means every route in the solution." - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "do_this_next": { + "type": "string" + }, + "routes": { + "items": { + "type": "object" + }, + "type": "array" + }, + "totals": { + "type": "object" + }, + "workload_model": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"analyze_routesDictOutput"
- Changed
auto_build17 fields changed- changed
Input schema / properties / build_mode / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "mode": { + "const": "fixed_territory_count" + }, + "territory_count": { + "minimum": 1, + "type": "integer" + } + }, + "required": [ + "mode", + "territory_count" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "cycle_unit": { + "enum": [ + "day", + "week", + "month", + "quarter", + "year" + ], + "type": "string" + }, + "mode": { + "const": "fixed_workload_target" + }, + "target_workload": { + "exclusiveMinimum": 0, + "type": "number" + }, + "workload_unit": { + "enum": [ + "minutes", + "hours" + ], + "type": "string" + } + }, + "required": [ + "mode", + "target_workload" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "mode": { + "const": "scoped_split" + }, + "preserve_other_territories": { + "const": true, + "default": true + }, + "replacement_territory_count": { + "minimum": 2, + "type": "integer" + }, + "source_tal_id": { + "minLength": 1, + "type": "string" + }, + "source_territory_id": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "mode", + "source_tal_id", + "source_territory_id", + "replacement_territory_count" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } +] - added
Input schema / properties / build_mode / descriptionAdded value: +"Required for execution unless a form-capable modern client answers sizing via Resolve/Elicit. Legacy/no-capability hosts still receive CLARIFICATION_REQUIRED when omitted." - removed
Input schema / properties / build_mode / titleRemoved value: -"Build Mode" - added
Input schema / properties / ignore_visit_frequency / descriptionAdded value: +"When true, every account is one visit per cycle. Mutually exclusive with visit_frequency_field. Required as the ignore choice when the point layer declares a visit-frequency column." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - changed
Input schema / properties / part_filter / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "minProperties": 1, + "properties": { + "county_name": { + "type": [ + "string", + "array" + ] + }, + "part_layer": { + "type": "string" + }, + "population": { + "oneOf": [ + { + "type": "number" + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "between": { + "items": { + "type": "number" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "eq": { + "type": "number" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + }, + "spatial": { + "additionalProperties": false, + "oneOf": [ + { + "required": [ + "bbox" + ] + }, + { + "required": [ + "geometry" + ] + } + ], + "properties": { + "bbox": { + "description": "[min_lon, min_lat, max_lon, max_lat] in EPSG:4326.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "geometry": { + "description": "GeoJSON Polygon or MultiPolygon in EPSG:4326.", + "type": "object" + }, + "operator": { + "enum": [ + "intersects", + "within", + "contains" + ], + "type": "string" + } + }, + "required": [ + "operator" + ], + "type": "object" + }, + "state_abbr": { + "type": [ + "string", + "array" + ] + }, + "territory": { + "additionalProperties": false, + "oneOf": [ + { + "required": [ + "ts_handle" + ] + }, + { + "required": [ + "map_session_id" + ] + } + ], + "properties": { + "include_descendants": { + "default": true, + "description": "When true, rollup territories include descendant leaf territory part_ids.", + "type": "boolean" + }, + "map_session_id": { + "description": "Open map session whose Territory Solution holds the TAL.", + "minLength": 1, + "type": "string" + }, + "tal_id": { + "minLength": 1, + "type": "string" + }, + "territory_id": { + "minLength": 1, + "type": "string" + }, + "ts_handle": { + "description": "Territory Solution reference (tsh_...) holding the TAL (no inline TS).", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "tal_id", + "territory_id" + ], + "type": "object" + }, + "text": { + "additionalProperties": false, + "properties": { + "case_sensitive": { + "default": false, + "type": "boolean" + }, + "field": { + "description": "Safe text field to search. Defaults to the public part ID column.", + "type": "string" + }, + "mode": { + "default": "prefix", + "enum": [ + "prefix", + "contains", + "exact" + ], + "type": "string" + }, + "value": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / part_filter / descriptionAdded value: +"Attribute filter resolved via query_parts (e.g. {\"state_abbr\": \"TX\"}). Implies part_scope explicit. Mutually exclusive with part_ids." - removed
Input schema / properties / part_filter / titleRemoved value: -"Part Filter" - added
Input schema / properties / part_ids / descriptionAdded value: +"Explicit part selection set. Implies part_scope explicit. Mutually exclusive with part_filter." - added
Input schema / properties / part_scope / descriptionAdded value: +"Parts eligible for partition. Default bbox_intersect: all parts intersecting the account-point bounding box. point_matched: only parts containing at least one account. explicit: part_ids or part_filter (e.g. state_abbr TX)." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - added
Input schema / properties / visit_frequency_field / descriptionAdded value: +"Point column that scales territory workload by visits per cycle. Mutually exclusive with ignore_visit_frequency. Required as use-or-ignore when the point layer declares a visit-frequency column." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields.", + "properties": { + "assignment_count": { + "type": "integer" + }, + "assignments_artifact": { + "type": "object" + }, + "build_mode_summary": { + "type": "object" + }, + "distribution_summary": { + "type": "object" + }, + "do_this_next": { + "type": [ + "object", + "string" + ] + }, + "download_url": { + "type": "string" + }, + "expires_at": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "objective_summary": { + "type": "object" + }, + "output_mode": { + "type": "string" + }, + "part_scope_summary": { + "type": "object" + }, + "phase_timings_ms": { + "type": "object" + }, + "scoped_split_summary": { + "type": "object" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "tal_id": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "territory_count": { + "type": "integer" + }, + "ts_handle": { + "type": "string" + }, + "ts_identity": { + "type": "object" + }, + "ts_omitted": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"auto_buildDictOutput"
- Changed
calculate_route23 fields changed- added
Input schema / $defsAdded value: +{ + "RepoShape1": { + "description": "Several inline stops in one source.", + "items": { + "$ref": "#/$defs/RepoShape3" + }, + "type": "array" + }, + "RepoShape2": { + "additionalProperties": true, + "description": "Property equality filter applied to the point layer, e.g. {\"territory_id\": \"<leaf id>\"} after auto_build or {\"bucket_id\": \"d01-b1\"} on <point_layer>_visits after schedule_visits (which also stamps schedule_day, schedule_date, and contractor_id). A display label such as T1 does not match. A list value matches any member.", + "type": "object" + }, + "RepoShape3": { + "additionalProperties": true, + "properties": { + "label": { + "type": "string" + }, + "latitude": { + "maximum": 90, + "minimum": -90, + "type": "number" + }, + "longitude": { + "maximum": 180, + "minimum": -180, + "type": "number" + }, + "properties": { + "additionalProperties": true, + "type": "object" + }, + "stop_id": { + "type": "string" + } + }, + "required": [ + "latitude", + "longitude" + ], + "type": "object" + } +} - added
Input schema / properties / depart_at / descriptionAdded value: +"RFC 3339 departure time. Drives traffic-aware durations. Defaults to now." - changed
Input schema / properties / end / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "filter": { + "$ref": "#/$defs/RepoShape2" + }, + "label": { + "type": "string" + }, + "label_field": { + "description": "Point property to use as the stop label on the map.", + "minLength": 1, + "type": "string" + }, + "latitude": { + "maximum": 90, + "minimum": -90, + "type": "number" + }, + "longitude": { + "maximum": 180, + "minimum": -180, + "type": "number" + }, + "point_ids": { + "description": "Specific point_id values from point_layer (a <point_layer>_visits layer uses <account_id>#<visit_index>). An id that is not a point_id selects every point with that account_id. For an as_given set, this array is also the visit order.", + "items": { + "type": "string" + }, + "type": "array" + }, + "point_layer": { + "description": "Ingested point layer to draw stops from. Resolved against ts / ts_handle / map_session_id.", + "minLength": 1, + "type": "string" + }, + "stop_id": { + "description": "Id for an inline stop. Point-layer stops always use the point's point_id, so a route pushed to Designer links to the same point.", + "minLength": 1, + "type": "string" + }, + "stops": { + "$ref": "#/$defs/RepoShape1" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / end / descriptionAdded value: +"Destination. Required for route_type=tour, rejected otherwise." - removed
Input schema / properties / end / titleRemoved value: -"End" - added
Input schema / properties / include_geometry / descriptionAdded value: +"Set false to skip the route polyline when only sequence and timings are needed." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / route_id / descriptionAdded value: +"Stable identity for the route inside the solution. A new route_id adds a route alongside the existing ones; reusing a route_id replaces that route in place. To add or drop a stop, call again with the SAME route_id and the revised stop list — there is no add-stop tool and delete_route is for dropping the whole route. Defaults to a slug of route_label, else a generated id." - added
Input schema / properties / route_label / descriptionAdded value: +"Display name for the route on the map and in the legend. Seeds route_id when route_id is omitted." - added
Input schema / properties / route_type / descriptionAdded value: +"circuit returns to start; tour finishes at the declared end (required); open_tour lets the optimizer choose the final stop and never returns to start." - added
Input schema / properties / start / descriptionAdded value: +"Origin. Must resolve to exactly one stop." - added
Input schema / properties / start / propertiesAdded value: +{ + "filter": { + "$ref": "#/$defs/RepoShape2" + }, + "label": { + "type": "string" + }, + "label_field": { + "description": "Point property to use as the stop label on the map.", + "minLength": 1, + "type": "string" + }, + "latitude": { + "maximum": 90, + "minimum": -90, + "type": "number" + }, + "longitude": { + "maximum": 180, + "minimum": -180, + "type": "number" + }, + "point_ids": { + "description": "Specific point_id values from point_layer (a <point_layer>_visits layer uses <account_id>#<visit_index>). An id that is not a point_id selects every point with that account_id. For an as_given set, this array is also the visit order.", + "items": { + "type": "string" + }, + "type": "array" + }, + "point_layer": { + "description": "Ingested point layer to draw stops from. Resolved against ts / ts_handle / map_session_id.", + "minLength": 1, + "type": "string" + }, + "stop_id": { + "description": "Id for an inline stop. Point-layer stops always use the point's point_id, so a route pushed to Designer links to the same point.", + "minLength": 1, + "type": "string" + }, + "stops": { + "$ref": "#/$defs/RepoShape1" + } +} - removed
Input schema / properties / start / titleRemoved value: -"Start" - changed
Input schema / properties / stop_sets / items / additionalPropertiesPrevious value: -trueNew value: +false - added
Input schema / properties / stop_sets / items / descriptionAdded value: +"One group of stops. Sets are visited in array order and optimization never moves a stop across a set boundary." - added
Input schema / properties / stop_sets / items / propertiesAdded value: +{ + "group_by_field": { + "description": "Point property that splits the set into ordered bands, e.g. route_priority. Every band-1 stop precedes every band-2 stop, and stops are optimized within a band.", + "minLength": 1, + "type": "string" + }, + "group_direction": { + "default": "asc", + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "order": { + "default": "optimize", + "description": "as_given keeps the declared order; optimize sequences the set to reduce travel.", + "enum": [ + "as_given", + "optimize" + ], + "type": "string" + }, + "set_id": { + "description": "Identifier echoed on each stop in the result. Defaults to set-1, set-2, ...", + "minLength": 1, + "type": "string" + }, + "source": { + "additionalProperties": true, + "description": "Either inline coordinates or a reference to points already in the territory solution.", + "properties": { + "filter": { + "$ref": "#/$defs/RepoShape2" + }, + "label": { + "type": "string" + }, + "label_field": { + "description": "Point property to use as the stop label on the map.", + "minLength": 1, + "type": "string" + }, + "latitude": { + "maximum": 90, + "minimum": -90, + "type": "number" + }, + "longitude": { + "maximum": 180, + "minimum": -180, + "type": "number" + }, + "point_ids": { + "description": "Specific point_id values from point_layer (a <point_layer>_visits layer uses <account_id>#<visit_index>). An id that is not a point_id selects every point with that account_id. For an as_given set, this array is also the visit order.", + "items": { + "type": "string" + }, + "type": "array" + }, + "point_layer": { + "description": "Ingested point layer to draw stops from. Resolved against ts / ts_handle / map_session_id.", + "minLength": 1, + "type": "string" + }, + "stop_id": { + "description": "Id for an inline stop. Point-layer stops always use the point's point_id, so a route pushed to Designer links to the same point.", + "minLength": 1, + "type": "string" + }, + "stops": { + "$ref": "#/$defs/RepoShape1" + } + }, + "type": "object" + } +} - added
Input schema / properties / stop_sets / minItemsAdded value: +1 - removed
Input schema / properties / stop_sets / titleRemoved value: -"Stop Sets" - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "created_at": { + "type": "string" + }, + "do_this_next": { + "type": "object" + }, + "estimated_remaining_ms": { + "type": "integer" + }, + "estimated_start_ms": { + "type": "integer" + }, + "expires_at": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "next_poll_at": { + "type": "string" + }, + "phase": { + "type": "string" + }, + "poll_interval_ms": { + "type": "integer" + }, + "poll_loop": { + "type": "object" + }, + "progress": { + "type": "number" + }, + "queue_depth": { + "type": "integer" + }, + "queue_lane": {}, + "queue_position": { + "type": "integer" + }, + "recommended_poll_delay_ms": { + "type": "integer" + }, + "required_input": { + "type": "object" + }, + "result_resource_uri": { + "type": "string" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "status_resource_uri": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "tool_name": { + "type": "string" + }, + "total": { + "type": [ + "null", + "number" + ] + }, + "user_cancelled": { + "type": "boolean" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"calculate_routeDictOutput"
- Changed
cluster_points18 fields changed- changed
Input schema / properties / build_mode / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "mode": { + "const": "fixed_territory_count" + }, + "territory_count": { + "minimum": 1, + "type": "integer" + } + }, + "required": [ + "mode", + "territory_count" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "mode": { + "const": "fixed_workload_target" + }, + "target_workload": { + "exclusiveMinimum": 0, + "type": "number" + }, + "workload_unit": { + "default": "hours", + "enum": [ + "minutes", + "hours" + ], + "type": "string" + } + }, + "required": [ + "mode", + "target_workload" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } +] - added
Input schema / properties / build_mode / descriptionAdded value: +"Required unless modern form elicitation supplies sizing." - removed
Input schema / properties / build_mode / titleRemoved value: -"Build Mode" - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - changed
Input schema / properties / metric_fields / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": false, + "properties": { + "field": { + "minLength": 1, + "type": "string" + }, + "label": { + "type": "string" + }, + "role": { + "description": "Optional semantic role for workload columns. Agents should set visit_frequency or dwell_time when declaring canonical workload inputs.", + "type": "string" + }, + "type": { + "enum": [ + "number", + "integer", + "string", + "boolean" + ], + "type": "string" + }, + "unit": { + "type": "string" + } + }, + "required": [ + "field" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / metric_fields / descriptionAdded value: +"Metric columns to declare on the point layer (same shape as ingest_accounts metric_fields)." - removed
Input schema / properties / metric_fields / titleRemoved value: -"Metric Fields" - changed
Input schema / properties / point_filter / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": { + "anyOf": [ + { + "type": [ + "string", + "number", + "boolean" + ] + }, + { + "items": { + "type": [ + "string", + "number", + "boolean" + ] + }, + "minItems": 1, + "type": "array" + } + ] + }, + "minProperties": 1, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / point_filter / descriptionAdded value: +"Optional property filter on the named point layer. Keys are point properties (equality or IN list). Multiple keys are AND. Example: {\"STATE\": \"FL\"}. Unmatched points stay on the layer ungrouped. part_filter and part_scope are not used here." - removed
Input schema / properties / point_filter / titleRemoved value: -"Point Filter" - added
Input schema / properties / seed_attraction / descriptionAdded value: +"How hard each group centroid is held at its seed. 100 pins it at the seed; 0 seeds only the starting point and lets the solver drift to the workload centroid. Requires seed_point_layer." - added
Input schema / properties / seed_point_layer / descriptionAdded value: +"Second ingested point layer whose locations anchor the group centroids one-to-one (technician homes, depots). Must differ from point_layer; its point count must equal the group count." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "annotation_summary": { + "type": "object" + }, + "build_mode_summary": { + "type": "object" + }, + "creates_tal": { + "type": "boolean" + }, + "distribution_summary": { + "type": "object" + }, + "do_this_next": { + "type": "string" + }, + "expires_at": { + "type": "string" + }, + "group_count": { + "type": "integer" + }, + "group_field": { + "type": "string" + }, + "group_labels": { + "items": { + "type": "string" + }, + "type": "array" + }, + "groups": { + "items": { + "type": "object" + }, + "type": "array" + }, + "map_refresh": { + "type": "object" + }, + "objective_summary": { + "type": "object" + }, + "point_count": { + "type": "integer" + }, + "point_filter_summary": { + "type": "object" + }, + "point_layer": { + "type": "string" + }, + "seed_summary": { + "type": "object" + }, + "ts_handle": { + "type": "string" + }, + "ts_identity": { + "type": "object" + }, + "ts_omitted": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"cluster_pointsDictOutput"
- Changed
configure_map21 fields changed- added
Input schema / properties / active_tal_id / descriptionAdded value: +"Durable active alignment restored when the Territory Solution opens." - added
Input schema / properties / center / descriptionAdded value: +"Default camera center as GeoJSON/MapLibre [longitude, latitude]. Persists to map_config.center. An open MC jumps when this request includes center and/or zoom; later config_changed events without those fields leave the camera where it is." - changed
Input schema / properties / classification / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "bins": { + "minimum": 1, + "type": "integer" + }, + "breaks": { + "items": { + "type": "number" + }, + "type": "array" + }, + "colors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "labels": { + "items": { + "type": "string" + }, + "type": "array" + }, + "method": { + "minLength": 1, + "type": "string" + }, + "metric": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / classification / descriptionAdded value: +"Project-level map_config classification (e.g. primary metric context for selection-impact preview). It leaves point colors unchanged; a patch naming a point_layer is routed to point_layer_classifications with a warning." - removed
Input schema / properties / classification / titleRemoved value: -"Classification" - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - changed
Input schema / properties / point_layer_classifications / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": true, + "properties": { + "channel": { + "default": "color", + "enum": [ + "color", + "size", + "shape" + ], + "type": "string" + }, + "class_count": { + "default": 5, + "maximum": 12, + "minimum": 2, + "type": "integer" + }, + "classes": { + "description": "Manual breaks. Each class needs value/values (categorical) or min/max (range) plus the channel value.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "clear": { + "description": "When true, remove this channel's classification and leave the other channels and the base style. field is not required. Group colors stored on classification are removed when that object is this channel.", + "type": "boolean" + }, + "colors": { + "description": "Optional explicit color ramp for the color channel; defaults to the shared MC palette.", + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "field": { + "description": "Point property to classify. Required unless the entry only patches style.", + "minLength": 1, + "type": "string" + }, + "filterable": { + "default": true, + "type": "boolean" + }, + "label": { + "minLength": 1, + "type": "string" + }, + "max_size": { + "exclusiveMinimum": 0, + "type": "number" + }, + "method": { + "description": "Defaults to quantile when every value is numeric, categorical otherwise; manual when classes are supplied.", + "enum": [ + "quantile", + "equal_interval", + "categorical", + "manual" + ], + "type": "string" + }, + "min_size": { + "exclusiveMinimum": 0, + "type": "number" + }, + "point_layer": { + "description": "Target point layer id from ts.properties.point_layers or ingest_accounts.", + "minLength": 1, + "type": "string" + }, + "shapes": { + "description": "Required for the shape channel unless every manual class carries a shape. Catalog: circle, square, triangle, diamond, star, cross, house, pin, flag, hexagon, pentagon, shield, arrow_up, building, person (aliases: home, marker/map_pin, hex, arrow/up, warehouse/depot, user/people/tech/technician/rep, plus/x).", + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "sizes": { + "items": { + "exclusiveMinimum": 0, + "type": "number" + }, + "type": "array" + }, + "style": { + "additionalProperties": true, + "description": "Base point symbol for the layer, merged over any existing style. Gives two point layers distinct colors.", + "properties": { + "color": { + "minLength": 1, + "type": "string" + }, + "opacity": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "shape": { + "description": "Point symbol from the MC catalog: circle|square|triangle|diamond|star|cross|house|pin|flag|hexagon|pentagon|shield|arrow_up|building|person.", + "minLength": 1, + "type": "string" + }, + "size": { + "exclusiveMinimum": 0, + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "point_layer" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / point_layer_classifications / descriptionAdded value: +"Applied point-layer symbology. The server computes breaks from the in-session point features, writes ts.properties.point_layers[].<channel>_classification, and pushes config_changed so an open MC repaints. One entry per layer/channel." - removed
Input schema / properties / point_layer_classifications / titleRemoved value: -"Point Layer Classifications" - changed
Input schema / properties / presentation / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "debug_panel": { + "description": "Per-request debug modifier. When true, the MC #debug block shows session/mode/TAL/revision/zoom diagnostics and per-row legend meta. It replaces a custom QA template.", + "type": "boolean" + }, + "style_overrides": { + "additionalProperties": true, + "description": "Optional style hints forwarded to the MC renderer (may include theme: 'dark' | 'light' or debug_panel).", + "type": "object" + }, + "theme": { + "description": "Map Component basemap and UI theme ('dark' or 'light'; default 'dark'). Also accepted at top-level theme or presentation.style_overrides.theme.", + "enum": [ + "dark", + "light" + ], + "type": "string" + }, + "view_name": { + "description": "Built-in presentation template. Defaults: select mode → selection; empty project → empty; points-only TS → points_only; TAL/review → review. Diagnostics use presentation.debug_panel (or style_overrides.debug_panel), not a separate template.", + "enum": [ + "empty", + "points_only", + "review", + "selection" + ], + "type": "string" + } + }, + "title": "Optional Presentation View/Style Context", + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / presentation / descriptionAdded value: +"Named presentation context stored on map_config and restored when the TS opens." - removed
Input schema / properties / presentation / titleRemoved value: -"Presentation" - added
Input schema / properties / project_name / descriptionAdded value: +"First-class Territory Solution short name shown as the Map Component panel title. Persists to ts.properties.map_config.project_name; when an MC session is open for this TS, configure_map pushes config_changed so the title refreshes without reopening the map." - added
Input schema / properties / theme / descriptionAdded value: +"Map Component basemap and UI theme ('dark' or 'light'; default 'dark'). Persists to ts.properties.map_config.theme and repaints the open map session live." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - added
Input schema / properties / zoom / descriptionAdded value: +"Default MapLibre zoom (0-24). Persists to map_config.zoom. An open MC jumps when this request includes center and/or zoom." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "camera": { + "type": "object" + }, + "map_config": { + "type": "object" + }, + "map_push_status": { + "type": "string" + }, + "point_layer_classifications": { + "items": { + "type": "object" + }, + "type": "array" + }, + "ts_handle": { + "type": "string" + }, + "ts_identity": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"configure_mapDictOutput"
- Changed
create_territory_from_parts10 fields changed- added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / part_ids / descriptionAdded value: +"Parts for the new territory, e.g. committed part_ids from get_part_selection." - added
Input schema / properties / repair_policy / descriptionAdded value: +"Topology repair policy for dissolved geometry (default, strict, or report_only). Interior holes occupied by existing territories in the TS are never filled." - added
Input schema / properties / tal_id / descriptionAdded value: +"Existing TAL to append the new territory to; omit to start a new alignment." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"create_territory_from_partsDictOutput"
- Changed
delete_point_layer7 fields changed- added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / point_layer / descriptionAdded value: +"Point layer to delete: the point_layer id, or an exact unique layer label." - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "active_tal_id": { + "type": "string" + }, + "already_absent": { + "type": "boolean" + }, + "deleted_point_layer": { + "type": [ + "null", + "string" + ] + }, + "derived_point_layers_kept": { + "items": { + "type": "string" + }, + "type": "array" + }, + "do_this_next": { + "type": "string" + }, + "map_refresh": { + "type": "object" + }, + "remaining_point_layers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "removed_feature_count": { + "type": "integer" + }, + "requested_point_layer": { + "type": "string" + }, + "routes_still_referencing": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ts_handle": { + "type": "string" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"delete_point_layerDictOutput"
- Changed
delete_route7 fields changed- added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / route_id / descriptionAdded value: +"Route to delete: the route_id, or an exact unique route label. Removing one stop is a calculate_route with the same route_id and the remaining stops." - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "already_absent": { + "type": "boolean" + }, + "deleted_route_id": { + "type": [ + "null", + "string" + ] + }, + "do_this_next": { + "type": "string" + }, + "map_refresh": { + "type": "object" + }, + "remaining_route_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "requested_route_id": { + "type": "string" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"delete_routeDictOutput"
- Changed
delete_tal7 fields changed- added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / tal_id / descriptionAdded value: +"Territory layer / alignment to delete: tal_id or an exact unique TAL label. Removes the whole layer in one call (users say territory layer / all territories / alignment more often than TAL). One leaf is removed with delete_territory." - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "active_tal_id": { + "type": [ + "null", + "string" + ] + }, + "already_absent": { + "type": "boolean" + }, + "deleted_tal_id": { + "type": [ + "null", + "string" + ] + }, + "do_this_next": { + "type": "string" + }, + "map_refresh": { + "type": "object" + }, + "remaining_tal_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "requested_tal_id": { + "type": "string" + }, + "ts_handle": { + "type": "string" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"delete_talDictOutput"
- Changed
delete_territory11 fields changed- added
Input schema / properties / expected_revision / descriptionAdded value: +"Optional optimistic concurrency revision." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / part_layer / descriptionAdded value: +"Part layer name when not inferable from the TAL (e.g. us_zips)." - added
Input schema / properties / tal_id / descriptionAdded value: +"Target TAL containing the leaf to delete." - added
Input schema / properties / territory_id / descriptionAdded value: +"Leaf territory_id (e.g. tal-t1-t1) or a unique display name/label alias (e.g. T1)." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "already_absent": { + "type": "boolean" + }, + "deleted_territory_id": { + "type": [ + "null", + "string" + ] + }, + "do_this_next": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "leaf_territories": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requested_territory_id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "tal_id": { + "type": "string" + }, + "territories_removed": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"delete_territoryDictOutput"
- Changed
direct_build12 fields changed- removed
Input schema / properties / assignmentsRemoved value: -{ - "anyOf": [ - { - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Assignments" -} - added
Input schema / properties / assignments_handle / descriptionAdded value: +"Required. upload_handle (aup_...) from request_assignment_upload. Single-use: the build claims it." - added
Input schema / properties / duplicate_part_policy / descriptionAdded value: +"When the same part_id maps to different territory_path values, keep_first (default) keeps the first row and skips the rest with a warning; keep_last keeps the last row; fail aborts with CLARIFICATION_REQUIRED." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / missing_part_policy / descriptionAdded value: +"Controls assigned part IDs that are absent from the selected polygon part layer. fail returns UNKNOWN_PART_ID. drop_with_warning omits them, lists them in invalid_parts, and proceeds with geometry-covered assignments." - added
Input schema / properties / tal_id / descriptionAdded value: +"Optional caller-supplied TAL identifier. When omitted, the server derives a stable ID from tal_label. Supplied IDs must not collide with an existing TAL in the input TS." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields.", + "properties": { + "assignment_summary": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "expires_at": { + "type": "string" + }, + "geometry_summary": { + "type": "object" + }, + "hierarchy_summary": { + "type": "object" + }, + "invalid_parts": { + "items": { + "type": "string" + }, + "type": "array" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "repair_summary": { + "type": "object" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "tal_id": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "territory_count": { + "type": "integer" + }, + "ts_handle": { + "type": "string" + }, + "ts_identity": { + "type": "object" + }, + "ts_omitted": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"direct_buildDictOutput"
- Changed
discover_intent8 fields changed- changed
Input schema / properties / context / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "has_point_layer": { + "type": "boolean" + }, + "has_ts_handle": { + "type": "boolean" + }, + "has_visit_frequency_field": { + "description": "True when the active point layer declares a visit-frequency column. Appends the route-vs-schedule question on route_stops / periodic_scheduling and the use-or-ignore question on build_from_accounts / account_grouping.", + "type": "boolean" + }, + "part_layers_loaded": { + "type": "boolean" + }, + "viewer_connected": { + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / descriptionAdded value: +"Optional state flags that tailor the recommended workflow." - removed
Input schema / properties / context / titleRemoved value: -"Context" - added
Input schema / properties / user_request / descriptionAdded value: +"The raw natural-language request to classify." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "clarifying_questions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "confidence": { + "type": "string" + }, + "guidance": { + "type": [ + "null", + "object" + ] + }, + "guidance_uri": { + "type": "string" + }, + "intent_category": { + "type": "string" + }, + "matched_signals": { + "items": { + "type": "string" + }, + "type": "array" + }, + "mc_first_required": { + "type": "boolean" + }, + "recommended_workflow": { + "items": { + "type": "string" + }, + "type": "array" + }, + "required_inputs": { + "items": { + "type": "string" + }, + "type": "array" + }, + "resolved_part_layer": { + "type": [ + "null", + "string" + ] + }, + "tier1_tool": { + "type": [ + "null", + "string" + ] + }, + "tier2_alternatives": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"discover_intentDictOutput"
- Changed
ensure_map_viewer6 fields changed- added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization." - added
Input schema / properties / wait_seconds / descriptionAdded value: +"Optional server-side wait window. 0 returns the current snapshot only. Values above 30 are clamped to 30 s per call; on VIEWER_NOT_CONNECTED the error details carry requested_wait_seconds, max_wait_seconds, and next_call (call again)." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "map_session_id": { + "type": "string" + }, + "next_step": { + "type": "string" + }, + "suggested_action": { + "type": "string" + }, + "viewer_status": { + "type": "object" + }, + "waited_ms": { + "type": "integer" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"ensure_map_viewerDictOutput"
- Changed
ep_graph_traverse4 fields changed- removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"ep_graph_traverseDictOutput"
- Changed
ep_list_topics4 fields changed- removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"ep_list_topicsDictOutput"
- Changed
ep_search4 fields changed- removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"ep_searchDictOutput"
- Changed
export_geojson12 fields changed- added
Input schema / properties / include_routes / descriptionAdded value: +"Set false to drop the whole route family regardless of route_layers." - added
Input schema / properties / job_id / descriptionAdded value: +"task_id (same value as job_id) of a completed build or ingest task; its Territory Solution is the input." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / point_layers / descriptionAdded value: +"Point layers to include; omit for all." - added
Input schema / properties / route_layers / descriptionAdded value: +"route_id values to include; omit for all. Each exported route emits one route_path feature plus one route_stop feature per visit (never coalesced)." - added
Input schema / properties / tal_ids / descriptionAdded value: +"TALs to materialize; omit for all." - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - added
Input schema / properties / zip / descriptionAdded value: +"Default true stores/downloads gzip. Set false for uncompressed GeoJSON." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"export_geojsonDictOutput"
- Changed
extract_tal_branch9 fields changed- added
Input schema / properties / branch_rollup_territory_id / descriptionAdded value: +"Rollup territory whose subtree becomes the branch. Or pass branch_territory_path." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / tal_id / descriptionAdded value: +"Hierarchical TAL (alignment) to branch from." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "branch_metadata": { + "type": "object" + }, + "expires_at": { + "type": "string" + }, + "map_url": { + "type": "string" + }, + "ts_handle": { + "type": "string" + }, + "ts_identity": { + "type": "object" + }, + "ts_omitted": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"extract_tal_branchDictOutput"
- Changed
ezt10 fields changed- added
Input schema / properties / accounts_handle / descriptionAdded value: +"upload_handle (aup_...) from request_account_upload." - added
Input schema / properties / assignments_handle / descriptionAdded value: +"upload_handle (aup_...) from request_assignment_upload." - changed
Input schema / properties / csv_file / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "data": { + "description": "RFC 2397 data: URI.", + "type": "string" + }, + "download_url": { + "description": "Temporary HTTPS download URL from the host.", + "type": "string" + }, + "file_id": { + "type": "string" + }, + "file_name": { + "type": "string" + }, + "mime_type": { + "type": "string" + } + }, + "type": "object" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / csv_file / descriptionAdded value: +"Host file reference: an object with download_url (ChatGPT/OpenAI file param) or data (data: URI), or a URL / data: URI string. Local paths and bare file ids are rejected; for those, send the user to upload_url." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"eztDictOutput"
- Changed
geocode_address9 fields changed- added
Input schema / properties / accept_suboptimal_geocodes / descriptionAdded value: +"When true, accept suboptimal geocodes (e.g. ZIP centroids). Default false so geocode-only workflows surface NO_OPTIMAL_GEOCODE for human review." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - removed
Input schema / properties / rowsRemoved value: -{ - "items": { - "additionalProperties": true, - "type": "object" - }, - "title": "Rows", - "type": "array" -} - added
Input schema / properties / upload_handleAdded value: +{ + "description": "upload_handle (aup_...) from request_account_upload holding the address rows. Not claimed: ingest_accounts can reuse it.", + "title": "Upload Handle", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "rows" -]New value: +[ + "upload_handle" +] - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields.", + "properties": { + "do_this_next": { + "type": [ + "object", + "string" + ] + }, + "download_url": { + "type": "string" + }, + "failed_rows": { + "items": { + "type": "object" + }, + "type": "array" + }, + "failed_rows_truncated": { + "type": "boolean" + }, + "geocoded_rows_artifact": { + "type": "object" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "sample_rows": { + "items": { + "type": "object" + }, + "type": "array" + }, + "share_url": { + "type": "string" + }, + "share_url_expires_at": { + "type": "string" + }, + "share_with_user": { + "type": "string" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "suggested_ingest": { + "type": "object" + }, + "summary": { + "type": "object" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"geocode_addressDictOutput"
- Changed
get_guidance4 fields changed- removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"get_guidanceDictOutput"
- Changed
get_map_selection5 fields changed- added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"get_map_selectionDictOutput"
- Changed
get_map_visualization18 fields changed- added
Input schema / properties / active_tal_id / descriptionAdded value: +"Alignment to show as active." - added
Input schema / properties / expiry_seconds / descriptionAdded value: +"Requested session TTL in seconds. Server may cap at policy maximum." - changed
Input schema / properties / interaction_flags / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "allow_click_select": { + "default": true, + "description": "Enable click-to-toggle part selection. When false and lasso is enabled, select mode starts in lasso.", + "type": "boolean" + }, + "allow_lasso_select": { + "default": true, + "description": "Enable the MC freehand lasso tool in select mode. Lasso adds every visibly overlapping part and preserves the existing selection for click fine-tuning.", + "type": "boolean" + }, + "allow_territory_filter": { + "default": false, + "type": "boolean" + } + }, + "title": "Allowed Interaction Flags for select Mode", + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / interaction_flags / descriptionAdded value: +"Only meaningful in select mode." - removed
Input schema / properties / interaction_flags / titleRemoved value: -"Interaction Flags" - added
Input schema / properties / job_id / descriptionAdded value: +"task_id (same value as job_id) of a completed build or ingest task; its Territory Solution is the input." - added
Input schema / properties / mode / descriptionAdded value: +"view — read-only map review/share/verification, no selection commits. select — allows transient local selection and committed selection events." - added
Input schema / properties / new_project / descriptionAdded value: +"Start a fresh map session (session_exists=false) instead of reusing the caller's open workspace. Without ts, ts_handle, or job_id, opens an empty project; with a TS source, opens that Territory Solution on a new session without carrying over prior routes, overlays, or analysis panels. Omitted empty+view reuses the existing project." - changed
Input schema / properties / presentation / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "debug_panel": { + "description": "Per-request debug modifier. When true, the MC #debug block shows session/mode/TAL/revision/zoom diagnostics and per-row legend meta. It replaces a custom QA template.", + "type": "boolean" + }, + "style_overrides": { + "additionalProperties": true, + "description": "Optional style hints forwarded to the MC renderer (may include theme: 'dark' | 'light' or debug_panel).", + "type": "object" + }, + "theme": { + "description": "Map Component basemap and UI theme ('dark' or 'light'; default 'dark'). Also accepted at top-level theme or presentation.style_overrides.theme.", + "enum": [ + "dark", + "light" + ], + "type": "string" + }, + "view_name": { + "description": "Built-in presentation template. Defaults: select mode → selection; empty project → empty; points-only TS → points_only; TAL/review → review. Diagnostics use presentation.debug_panel (or style_overrides.debug_panel), not a separate template.", + "enum": [ + "empty", + "points_only", + "review", + "selection" + ], + "type": "string" + } + }, + "title": "Optional Presentation View/Style Context", + "type": "object" + }, + { + "type": "null" + } +] - removed
Input schema / properties / presentation / titleRemoved value: -"Presentation" - added
Input schema / properties / theme / descriptionAdded value: +"Map Component basemap and UI theme ('dark' or 'light'; default 'dark')." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - added
Input schema / properties / user_id / descriptionAdded value: +"Stable caller id; a second call with the same user_id returns the same map." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "active_part_layer": { + "type": "string" + }, + "active_tal_summary": { + "type": "object" + }, + "expires_at": { + "type": "string" + }, + "loaded_part_layers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "map_session_id": { + "type": "string" + }, + "map_url": { + "type": "string" + }, + "new_project": { + "type": "boolean" + }, + "next_step": { + "type": "string" + }, + "selection_resource_uri": { + "type": "string" + }, + "session_exists": { + "type": "boolean" + }, + "state_resource_uri": { + "type": "string" + }, + "ts_handle": { + "type": "string" + }, + "ts_identity": { + "type": "object" + }, + "viewer_status": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"get_map_visualizationDictOutput"
- Changed
get_part_selection5 fields changed- added
Input schema / properties / selection_task_id / descriptionAdded value: +"selection_task_id (psel_...) from request_part_selection." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "active_tal_id": { + "type": "string" + }, + "committed_at": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "do_this_next": { + "type": "object" + }, + "expires_at": { + "type": "string" + }, + "map_session_id": { + "type": "string" + }, + "part_layer": { + "type": "string" + }, + "poll_interval_ms": { + "type": "integer" + }, + "poll_loop": { + "type": "object" + }, + "prompt": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "recommended_poll_delay_ms": { + "type": "integer" + }, + "selection": { + "type": "object" + }, + "selection_task_id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "ts_identity": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"get_part_selectionDictOutput"
- Changed
import_designer_project6 fields changed- added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / project_id / descriptionAdded value: +"Designer project id from list_designer_projects." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"import_designer_projectDictOutput"
- Changed
import_geojson14 fields changed- added
Input schema / properties / geojson / descriptionAdded value: +"GeoJSON FeatureCollection: point features and/or EZT-exported territory features carrying part_ids. Incoming properties.style (color / opacity / size / shape / weight) on features and point_layers[] / route_layers[] is kept as-is; only missing paint is filled, so a reopened export paints exactly as saved (ts-reference.schema.json#/$defs/style)." - changed
Input schema / properties / geojson_file / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "oneOf": [ + { + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": true, + "properties": { + "download_url": { + "type": "string" + }, + "file_id": { + "type": "string" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } +] - added
Input schema / properties / geojson_file / descriptionAdded value: +"Host file parameter (openai/fileParams): an object with a temporary https download_url, or that URL as a string." - removed
Input schema / properties / geojson_file / titleRemoved value: -"Geojson File" - added
Input schema / properties / geojson_gzip / descriptionAdded value: +"Base64 gzip or zip bytes of a GeoJSON FeatureCollection." - added
Input schema / properties / overlay_policy / descriptionAdded value: +"Explicit opt-in for importing territory polygons without part_ids: assigns parts whose centroids fall inside each polygon." - added
Input schema / properties / part_layer / descriptionAdded value: +"Geography for overlay assignment (e.g. us_zips). Required with overlay_policy." - added
Input schema / properties / point_layer / descriptionAdded value: +"Name for the imported point layer (default: points)." - added
Input schema / properties / tal_label / descriptionAdded value: +"Label for the imported TAL when territory features lack TAL metadata." - added
Input schema / properties / upload_handle / descriptionAdded value: +"Upload link handle from import_geojson() with no file argument; returns its upload_status." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "do_this_next": { + "type": "string" + }, + "imported_at": { + "type": "string" + }, + "summary": { + "type": "object" + }, + "ts_handle": { + "type": "string" + }, + "ts_identity": { + "type": "object" + }, + "upload_handle": { + "type": "string" + }, + "upload_status": { + "type": "string" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"import_geojsonDictOutput"
- Changed
ingest_accounts31 fields changed- added
Input schema / $defsAdded value: +{ + "RepoShape1": { + "additionalProperties": false, + "properties": { + "field": { + "minLength": 1, + "type": "string" + }, + "label": { + "type": "string" + }, + "role": { + "description": "Optional semantic role for workload columns. Agents should set visit_frequency or dwell_time when declaring canonical workload inputs.", + "type": "string" + }, + "type": { + "enum": [ + "number", + "integer", + "string", + "boolean" + ], + "type": "string" + }, + "unit": { + "type": "string" + } + }, + "required": [ + "field" + ], + "type": "object" + } +} - added
Input schema / properties / accept_suboptimal_geocodes / descriptionAdded value: +"When true (default for ingest), accept provider suboptimal geocodes (e.g. ZIP centroids) so address-only rows become points. Set false to require optimal/point-address matches only." - added
Input schema / properties / accounts_handle / descriptionAdded value: +"Required. upload_handle (aup_...) from request_account_upload. Single-use: ingest claims it." - added
Input schema / properties / capacity_field / descriptionAdded value: +"Numeric contractor column holding capacity (e.g. jobs per month). Retained like a declared column." - added
Input schema / properties / display_fields / descriptionAdded value: +"Declared columns shown in Map Component point callouts. Undeclared columns are discarded at ingest and later operations on them fail with UNDECLARED_FIELD." - added
Input schema / properties / dwell_time_field / descriptionAdded value: +"Canonical per-account dwell column on point features. Pair with workload_fields unit metadata when values are in hours." - added
Input schema / properties / force_regeocode / descriptionAdded value: +"When true, ignore existing coordinates and geocode addresses. Also confirms intentional address geocoding when unused numeric lat/lon-like columns are present (skips needs_coordinate_fields guard)." - added
Input schema / properties / grouping_fields / descriptionAdded value: +"Declared columns used to group accounts (e.g. account_build grouping_field candidates). Declared fields are the retention contract: the compact TS keeps only id, coordinates, label, and declared fields; undeclared columns are discarded at ingest." - added
Input schema / properties / id_field / descriptionAdded value: +"Unique business key column. Duplicated label/name columns fail with blocked_by=needs_unique_row_id. With the default row_id and no unique column, the server synthesizes row-1, row-2, … when that column is absent." - added
Input schema / properties / label / descriptionAdded value: +"Legend name for the point layer. Omitted: the point_layer id in title case (accounts is 'Accounts', schools_conus is 'Schools Conus')." - added
Input schema / properties / latitude_field / descriptionAdded value: +"Latitude column. Defaults accept case-insensitive GIS aliases latitude/lat (including LAT). Override for non-standard headers (e.g. Address 1: Latitude). Explicit values win over aliases." - added
Input schema / properties / layer_role / descriptionAdded value: +"contractors marks the supply side of a service network (contractor, vendor, service provider) for analyze_network_coverage." - added
Input schema / properties / longitude_field / descriptionAdded value: +"Longitude column. Defaults accept case-insensitive GIS aliases longitude/lon/lng/long (including LON). Override for non-standard headers. Explicit values win over aliases." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - changed
Input schema / properties / metric_fields / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "default": [], + "items": { + "$ref": "#/$defs/RepoShape1" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / metric_fields / descriptionAdded value: +"Agent-confirmed business metric columns (for example revenue, sales, units) to persist on point-layer metadata for downstream build/analyze tools." - removed
Input schema / properties / metric_fields / titleRemoved value: -"Metric Fields" - removed
Input schema / properties / rowsRemoved value: -{ - "anyOf": [ - { - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Rows" -} - added
Input schema / properties / search_fields / descriptionAdded value: +"Declared columns searchable in the Map Component. Undeclared columns are discarded at ingest and later operations on them fail with UNDECLARED_FIELD." - added
Input schema / properties / service_zip_field / descriptionAdded value: +"Contractor column listing served ZIPs, comma-separated, for coverage.rule=zip_list. Retained like a declared column." - added
Input schema / properties / tier_field / descriptionAdded value: +"Contractor column holding the network tier (e.g. Preferred). Retained like a declared column." - added
Input schema / properties / trade_field / descriptionAdded value: +"Contractor column naming the trade(s) served (e.g. HVAC; comma-separated for several). Retained like a declared column." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - added
Input schema / properties / visit_frequency_field / descriptionAdded value: +"Canonical numeric visits-per-cycle column on point features. Agent-resolved; MCP validates presence and persists on point-layer metadata. Without one, MCP defaults each account to one visit per cycle." - changed
Input schema / properties / workload_fields / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "default": [], + "items": { + "$ref": "#/$defs/RepoShape1" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Input schema / properties / workload_fields / titleRemoved value: -"Workload Fields" - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "created_at": { + "type": "string" + }, + "do_this_next": { + "type": "object" + }, + "estimated_remaining_ms": { + "type": "integer" + }, + "estimated_start_ms": { + "type": "integer" + }, + "expires_at": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "next_poll_at": { + "type": "string" + }, + "phase": { + "type": "string" + }, + "poll_interval_ms": { + "type": "integer" + }, + "poll_loop": { + "type": "object" + }, + "progress": { + "type": "number" + }, + "queue_depth": { + "type": "integer" + }, + "queue_lane": {}, + "queue_position": { + "type": "integer" + }, + "recommended_poll_delay_ms": { + "type": "integer" + }, + "required_input": { + "type": "object" + }, + "result_resource_uri": { + "type": "string" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "status_resource_uri": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "tool_name": { + "type": "string" + }, + "total": { + "type": [ + "null", + "number" + ] + }, + "user_cancelled": { + "type": "boolean" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"ingest_accountsDictOutput"
- Changed
isochrone_build24 fields changed- added
Input schema / properties / avoid / descriptionAdded value: +"Road classes to keep out of the reachable area. Only values both providers document." - added
Input schema / properties / bands / descriptionAdded value: +"Budgets to draw at each origin. One band gives one leaf per origin; several give a rollup per origin with one leaf per band. Capped (default 5, TOO_MANY_BANDS)." - changed
Input schema / properties / bands / items / additionalPropertiesPrevious value: -trueNew value: +false - added
Input schema / properties / bands / items / descriptionAdded value: +"One reachable-range budget. Exactly one of time_budget_seconds or distance_budget_meters, and every band in a call must use the same one." - added
Input schema / properties / bands / items / oneOfAdded value: +[ + { + "required": [ + "time_budget_seconds" + ] + }, + { + "required": [ + "distance_budget_meters" + ] + } +] - added
Input schema / properties / bands / items / propertiesAdded value: +{ + "band_id": { + "description": "Stable identity for the band. Defaults to a slug of the budget, e.g. 20min or 25km.", + "minLength": 1, + "type": "string" + }, + "distance_budget_meters": { + "description": "Drive-distance budget. Capped at 500000m by the stricter provider.", + "exclusiveMinimum": 0, + "maximum": 500000, + "type": "number" + }, + "label": { + "description": "Display suffix for this band's territories. Defaults to a readable budget, e.g. \"20 min\".", + "type": "string" + }, + "time_budget_seconds": { + "description": "Drive-time budget. Capped at 21600s (6h) by the stricter provider.", + "exclusiveMinimum": 0, + "maximum": 21600, + "type": "number" + } +} - added
Input schema / properties / bands / minItemsAdded value: +1 - removed
Input schema / properties / bands / titleRemoved value: -"Bands" - added
Input schema / properties / depart_at / descriptionAdded value: +"RFC 3339 departure time, which shapes traffic-aware boundaries. There is no arrive_at: reachable range is forward-only." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / origins / descriptionAdded value: +"Centers to measure reachability from. Provider calls are origins x bands, so this is capped (default 25, TOO_MANY_ORIGINS)." - added
Input schema / properties / origins / items / descriptionAdded value: +"Either inline coordinates or a reference to points already in the territory solution. Same shape as calculate_route's stopSource, minus the ordering fields." - added
Input schema / properties / origins / items / propertiesAdded value: +{ + "filter": { + "additionalProperties": true, + "description": "Property equality filter applied to the point layer, e.g. {\"type\": \"branch\"}. A list value matches any member.", + "type": "object" + }, + "label": { + "description": "Display name for an inline origin.", + "type": "string" + }, + "label_field": { + "description": "Point property to use as the origin label, which seeds the territory name.", + "minLength": 1, + "type": "string" + }, + "latitude": { + "maximum": 90, + "minimum": -90, + "type": "number" + }, + "longitude": { + "maximum": 180, + "minimum": -180, + "type": "number" + }, + "origin_id": { + "description": "Stable identity for an inline origin. Echoed on every band territory and in the isochrone provenance block. Defaults to origin-1, origin-2, ...", + "minLength": 1, + "type": "string" + }, + "point_ids": { + "description": "Specific point IDs from point_layer. Each resolved point becomes one origin.", + "items": { + "type": "string" + }, + "type": "array" + }, + "point_layer": { + "description": "Ingested point layer to draw origins from. Resolved against ts_handle / map_session_id.", + "minLength": 1, + "type": "string" + } +} - added
Input schema / properties / origins / minItemsAdded value: +1 - removed
Input schema / properties / origins / titleRemoved value: -"Origins" - added
Input schema / properties / tal_id / descriptionAdded value: +"Stable identity for the TAL. Reusing an existing id replaces that TAL. Defaults to a slug of tal_label." - added
Input schema / properties / tal_label / descriptionAdded value: +"Display name for the TAL. Defaults to a readable summary, e.g. \"20 min drive time\"." - added
Input schema / properties / traffic / descriptionAdded value: +"Traffic-aware travel times. Ignored for a distance budget." - added
Input schema / properties / travel_mode / descriptionAdded value: +"Narrower than calculate_route on purpose: neither provider offers a pedestrian or bicycle reachable range." - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "created_at": { + "type": "string" + }, + "do_this_next": { + "type": "object" + }, + "estimated_remaining_ms": { + "type": "integer" + }, + "estimated_start_ms": { + "type": "integer" + }, + "expires_at": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "next_poll_at": { + "type": "string" + }, + "phase": { + "type": "string" + }, + "poll_interval_ms": { + "type": "integer" + }, + "poll_loop": { + "type": "object" + }, + "progress": { + "type": "number" + }, + "queue_depth": { + "type": "integer" + }, + "queue_lane": {}, + "queue_position": { + "type": "integer" + }, + "recommended_poll_delay_ms": { + "type": "integer" + }, + "required_input": { + "type": "object" + }, + "result_resource_uri": { + "type": "string" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "status_resource_uri": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "tool_name": { + "type": "string" + }, + "total": { + "type": [ + "null", + "number" + ] + }, + "user_cancelled": { + "type": "boolean" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"isochrone_buildDictOutput"
- Changed
link_designer4 fields changed- removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"link_designerDictOutput"
- Changed
list_designer_projects4 fields changed- removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"list_designer_projectsDictOutput"
- Changed
list_part_layers6 fields changed- added
Input schema / properties / country_code / descriptionAdded value: +"Optional 2-letter ISO 3166-1 alpha-2 country code (for example US, CA, GB, DE) to filter the returned part layers." - added
Input schema / properties / part_layer / descriptionAdded value: +"Optional canonical part layer identifier (for example us_zips, us_counties, ca_fsa, uk_areas, germany_postal) to fetch detailed metadata for one layer." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "country_code": { + "type": "string" + }, + "generated_at": { + "type": "string" + }, + "layer": { + "type": "object" + }, + "layer_count": { + "type": "integer" + }, + "layers": { + "items": { + "type": "object" + }, + "type": "array" + }, + "resource": { + "type": "string" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"list_part_layersDictOutput"
- Changed
load_analysis_panel11 fields changed- changed
Input schema / properties / analyses / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": true, + "description": "A full Analyze result. Must include tal_analyses plus ts_identity, and territory_metric_grids when metrics exist. A thin {tal_analyses} object is rejected.", + "properties": { + "default_presentation": { + "type": "object" + }, + "presentation_guidance_uri": { + "type": "string" + }, + "tal_analyses": { + "type": "array" + }, + "territory_metric_grids": { + "type": "array" + }, + "ts_identity": { + "type": "object" + } + }, + "required": [ + "tal_analyses" + ], + "type": "object" + }, + "maxItems": 4, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } +] - removed
Input schema / properties / analyses / titleRemoved value: -"Analyses" - added
Input schema / properties / dismiss / descriptionAdded value: +"true hides the whole dock, header bar included, and keeps stored stats. It takes no analyses, task_id, labels, roles, or presentation_mode." - added
Input schema / properties / job_id / descriptionAdded value: +"Compatibility alias for task_id." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization." - added
Input schema / properties / presentation_mode / descriptionAdded value: +"Panel mode. territory_metric_grid is default_presentation.view inside the Analyze result, not a presentation_mode." - added
Input schema / properties / task_id / descriptionAdded value: +"Completed analyze task_id. Same string as job_id. Hydrates analyses when analyses is omitted." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "analysis_count": { + "type": "integer" + }, + "analysis_panel": { + "type": "object" + }, + "dismissed": { + "type": "boolean" + }, + "labels": { + "type": "array" + }, + "map_session_id": { + "type": "string" + }, + "presentation_mode": { + "type": "string" + }, + "roles": { + "type": "array" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"load_analysis_panelDictOutput"
- Changed
points_in_territory15 fields changed- added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / max_points / descriptionAdded value: +"Cap on points listed per territory. point_count and metric_sums always cover every inside point." - added
Input schema / properties / metrics / descriptionAdded value: +"Numeric point columns to sum per territory. Defaults to the layer's declared metric fields." - changed
Input schema / properties / point_filter / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": { + "anyOf": [ + { + "type": [ + "string", + "number", + "boolean" + ] + }, + { + "items": { + "type": [ + "string", + "number", + "boolean" + ] + }, + "minItems": 1, + "type": "array" + } + ] + }, + "minProperties": 1, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / point_filter / descriptionAdded value: +"Optional attribute filter (column -> value or list of values, matched case-insensitively, e.g. {\"tier\": \"Gold\"}) applied to the point layer before counting and listing." - removed
Input schema / properties / point_filter / titleRemoved value: -"Point Filter" - added
Input schema / properties / point_layer / descriptionAdded value: +"Point layer id or exact unique label. Optional when the solution has one layer with points." - added
Input schema / properties / tal_id / descriptionAdded value: +"Territory alignment to query. Defaults to the active TAL, or the sole TAL with leaf polygons." - added
Input schema / properties / territory_id / descriptionAdded value: +"One leaf: its stable territory_id or exact unique display name. Mutually exclusive with territory_ids." - added
Input schema / properties / territory_ids / descriptionAdded value: +"Several leaves (stable ids or exact unique display names). With neither territory_id nor territory_ids, every leaf in the TAL." - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "counting": { + "type": "string" + }, + "do_this_next": { + "type": "string" + }, + "overlap_point_count": { + "type": "integer" + }, + "overlaps": { + "items": { + "type": "object" + }, + "type": "array" + }, + "point_layer": { + "type": "string" + }, + "tal_id": { + "type": "string" + }, + "tal_kind": { + "type": "string" + }, + "territories": { + "items": { + "type": "object" + }, + "type": "array" + }, + "totals": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"points_in_territoryDictOutput"
- Changed
push_to_designer10 fields changed- added
Input schema / properties / job_id / descriptionAdded value: +"task_id (same value as job_id) of a completed build or ingest task; its Territory Solution is the input." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / part_layer_id / descriptionAdded value: +"Designer catalog part layer to bind; defaults to the layer a pulled TAL came from." - added
Input schema / properties / project_id / descriptionAdded value: +"Designer project to overwrite in place; omit to create a new project named label." - added
Input schema / properties / tal_id / descriptionAdded value: +"Alignment to push; defaults to the active TAL." - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"push_to_designerDictOutput"
- Changed
query_parts11 fields changed- changed
Input schema / properties / filter / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "minProperties": 1, + "properties": { + "county_name": { + "type": [ + "string", + "array" + ] + }, + "part_layer": { + "type": "string" + }, + "population": { + "oneOf": [ + { + "type": "number" + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "between": { + "items": { + "type": "number" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "eq": { + "type": "number" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + }, + "spatial": { + "additionalProperties": false, + "oneOf": [ + { + "required": [ + "bbox" + ] + }, + { + "required": [ + "geometry" + ] + } + ], + "properties": { + "bbox": { + "description": "[min_lon, min_lat, max_lon, max_lat] in EPSG:4326.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "geometry": { + "description": "GeoJSON Polygon or MultiPolygon in EPSG:4326.", + "type": "object" + }, + "operator": { + "enum": [ + "intersects", + "within", + "contains" + ], + "type": "string" + } + }, + "required": [ + "operator" + ], + "type": "object" + }, + "state_abbr": { + "type": [ + "string", + "array" + ] + }, + "territory": { + "additionalProperties": false, + "oneOf": [ + { + "required": [ + "ts_handle" + ] + }, + { + "required": [ + "map_session_id" + ] + } + ], + "properties": { + "include_descendants": { + "default": true, + "description": "When true, rollup territories include descendant leaf territory part_ids.", + "type": "boolean" + }, + "map_session_id": { + "description": "Open map session whose Territory Solution holds the TAL.", + "minLength": 1, + "type": "string" + }, + "tal_id": { + "minLength": 1, + "type": "string" + }, + "territory_id": { + "minLength": 1, + "type": "string" + }, + "ts_handle": { + "description": "Territory Solution reference (tsh_...) holding the TAL (no inline TS).", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "tal_id", + "territory_id" + ], + "type": "object" + }, + "text": { + "additionalProperties": false, + "properties": { + "case_sensitive": { + "default": false, + "type": "boolean" + }, + "field": { + "description": "Safe text field to search. Defaults to the public part ID column.", + "type": "string" + }, + "mode": { + "default": "prefix", + "enum": [ + "prefix", + "contains", + "exact" + ], + "type": "string" + }, + "value": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / filter / descriptionAdded value: +"Attribute/text/range/spatial/territory filter. Mutually exclusive with top-level part_ids." - removed
Input schema / properties / filter / titleRemoved value: -"Filter" - added
Input schema / properties / max_results / descriptionAdded value: +"Maximum results per page. Server may enforce lower limits." - added
Input schema / properties / page_token / descriptionAdded value: +"Pagination token from a previous response." - added
Input schema / properties / part_ids / descriptionAdded value: +"Explicit list of part IDs. Mutually exclusive with filter. Useful for validation or enrichment." - added
Input schema / properties / part_layer / descriptionAdded value: +"Required part layer identifier, e.g. 'us_zips'." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields.", + "properties": { + "do_this_next": { + "type": "object" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "next_page_token": { + "type": "string" + }, + "part_layer": { + "type": "string" + }, + "parts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "total_count": { + "type": "integer" + }, + "warnings": { + "items": { + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"query_partsDictOutput"
- Changed
realign14 fields changed- added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - changed
Input schema / properties / moves / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": false, + "properties": { + "from_territory_id": { + "description": "Optional — provided for optimistic validation. If supplied and the part is not currently in this territory, the operation fails with UNKNOWN_SOURCE_TERRITORY.", + "type": "string" + }, + "part_id": { + "minLength": 1, + "type": "string" + }, + "to_territory_id": { + "description": "Target leaf territory ID within the specified tal_id. Unassigned parts may be assigned directly when no from_territory_id is supplied.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "part_id", + "to_territory_id" + ], + "title": "Directed Part-Move Operation", + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } +] - removed
Input schema / properties / moves / titleRemoved value: -"Moves" - added
Input schema / properties / part_ids / descriptionAdded value: +"Required for remove_parts operation." - added
Input schema / properties / part_layer / descriptionAdded value: +"Part layer name, e.g. us_zips, us_counties. Required when not inferable from the TAL." - added
Input schema / properties / realign_operation / descriptionAdded value: +"Realignment operation. Defaults to move_to_territory when moves[] is supplied." - added
Input schema / properties / remove_empty_territories / descriptionAdded value: +"When true with remove_parts, drop leaf territories that become empty." - added
Input schema / properties / tal_id / descriptionAdded value: +"Target TAL to realign. Required — ambiguous TAL is an error." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields.", + "properties": { + "changed_territories": { + "items": { + "type": "object" + }, + "type": "array" + }, + "do_this_next": { + "type": "object" + }, + "expires_at": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "map_refresh": { + "type": "object" + }, + "moved_part_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "next_action": { + "type": "string" + }, + "removed_part_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "repair_summary": { + "type": "object" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "tal_id": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "territories_removed": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ts_handle": { + "type": "string" + }, + "ts_identity": { + "type": "object" + }, + "ts_omitted": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"realignDictOutput"
- Changed
reintegrate_branch15 fields changed- changed
Input schema / properties / branch_metadata / additionalPropertiesPrevious value: -trueNew value: +false - added
Input schema / properties / branch_metadata / anyOfAdded value: +[ + { + "required": [ + "branch_part_ids" + ] + }, + { + "required": [ + "branch_part_ids_sha256", + "branch_part_ids_count" + ] + } +] - added
Input schema / properties / branch_metadata / oneOfAdded value: +[ + { + "required": [ + "branch_rollup_territory_id" + ] + }, + { + "required": [ + "branch_territory_path" + ] + } +] - added
Input schema / properties / branch_metadata / propertiesAdded value: +{ + "branch_part_ids": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "branch_part_ids_count": { + "minimum": 1, + "type": "integer" + }, + "branch_part_ids_sha256": { + "pattern": "^sha256:[A-Fa-f0-9]{64}$", + "type": "string" + }, + "branch_rollup_territory_id": { + "minLength": 1, + "type": "string" + }, + "branch_territory_path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "delegate_ref": { + "type": "string" + }, + "extract_revision": { + "minimum": 0, + "type": "integer" + }, + "extract_ts_id": { + "minLength": 1, + "type": "string" + }, + "extracted_at": { + "format": "date-time", + "type": "string" + }, + "locked_part_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "master_content_hash": { + "pattern": "^sha256:[A-Fa-f0-9]{64}$", + "type": "string" + }, + "master_revision": { + "minimum": 0, + "type": "integer" + }, + "master_ts_id": { + "minLength": 1, + "type": "string" + }, + "parent_ts_id": { + "minLength": 1, + "type": "string" + }, + "point_layer_scope": { + "const": "branch_parts_only", + "type": "string" + }, + "tal_id": { + "minLength": 1, + "type": "string" + } +} - added
Input schema / properties / branch_metadata / requiredAdded value: +[ + "master_ts_id", + "master_revision", + "tal_id", + "extract_ts_id", + "extract_revision", + "parent_ts_id", + "extracted_at", + "point_layer_scope" +] - changed
Input schema / properties / branch_metadata / titlePrevious value: -"Branch Metadata"New value: +"Branch Extract Metadata" - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - removed
Input schema / properties / master_tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Master Ts" -} - added
Input schema / properties / master_ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Input schema / properties / proposal_tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Proposal Ts" -} - added
Input schema / properties / proposal_ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "reintegrate_result": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"reintegrate_branchDictOutput"
- Changed
request_account_upload7 fields changed- changed
Input schema / properties / csv_file / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "data": { + "description": "RFC 2397 data: URI.", + "type": "string" + }, + "download_url": { + "description": "Temporary HTTPS download URL from the host.", + "type": "string" + }, + "file_id": { + "type": "string" + }, + "file_name": { + "type": "string" + }, + "mime_type": { + "type": "string" + } + }, + "type": "object" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / csv_file / descriptionAdded value: +"Host file reference: an object with download_url (ChatGPT/OpenAI file param) or data (data: URI), or a URL / data: URI string. Local paths and bare file ids are rejected; for those, send the user to upload_url." - added
Input schema / properties / upload_handle / descriptionAdded value: +"Existing upload_handle (aup_...) to append this chunk of rows to." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"request_account_uploadDictOutput"
- Changed
request_assignment_upload7 fields changed- changed
Input schema / properties / csv_file / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "data": { + "description": "RFC 2397 data: URI.", + "type": "string" + }, + "download_url": { + "description": "Temporary HTTPS download URL from the host.", + "type": "string" + }, + "file_id": { + "type": "string" + }, + "file_name": { + "type": "string" + }, + "mime_type": { + "type": "string" + } + }, + "type": "object" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / csv_file / descriptionAdded value: +"Host file reference: an object with download_url (ChatGPT/OpenAI file param) or data (data: URI), or a URL / data: URI string. Local paths and bare file ids are rejected; for those, send the user to upload_url." - added
Input schema / properties / upload_handle / descriptionAdded value: +"Existing upload_handle (aup_...) to append this chunk of rows to." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"request_assignment_uploadDictOutput"
- Changed
request_part_selection13 fields changed- added
Input schema / properties / active_tal_id / descriptionAdded value: +"Alignment shown as active while the person selects." - added
Input schema / properties / destination_territory_id / descriptionAdded value: +"Optional receiver leaf territory when Monica/agent named the destination up front." - added
Input schema / properties / map_session_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set.", + "title": "Map Session Id" +} - changed
Input schema / properties / new_territory / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "territory_id": { + "type": "string" + }, + "territory_label": { + "minLength": 1, + "type": "string" + }, + "territory_path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "type": "array" + } + }, + "required": [ + "territory_label" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Input schema / properties / new_territory / titleRemoved value: -"New Territory" - added
Input schema / properties / prompt / descriptionAdded value: +"Human-facing selection instruction shown by the host/agent or MC." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handleAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline.", + "title": "Ts Handle" +} - added
Input schema / properties / user_id / descriptionAdded value: +"Stable caller id; finds the open map when map_session_id is omitted." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "active_tal_id": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "destination_territory_id": { + "type": "string" + }, + "do_this_next": { + "type": "object" + }, + "expires_at": { + "type": "string" + }, + "map_session_id": { + "type": "string" + }, + "map_url": { + "type": "string" + }, + "new_territory": { + "type": "object" + }, + "part_layer": { + "type": "string" + }, + "poll_interval_ms": { + "type": "integer" + }, + "poll_loop": { + "type": "object" + }, + "prompt": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "realign_operation": { + "type": "string" + }, + "recommended_poll_delay_ms": { + "type": "integer" + }, + "remove_empty_territories": { + "type": "boolean" + }, + "selection_resource_uri": { + "type": "string" + }, + "selection_task_id": { + "type": "string" + }, + "session_exists": { + "type": "boolean" + }, + "state_resource_uri": { + "type": "string" + }, + "status": { + "type": "string" + }, + "ts_identity": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"request_part_selectionDictOutput"
- Changed
schedule_visits39 fields changed- added
Input schema / $defsAdded value: +{ + "RepoShape1": { + "additionalProperties": false, + "description": "Expands each matching point in point_layer into one contractor whose start is that point.", + "properties": { + "end": { + "$ref": "#/$defs/RepoShape3" + }, + "filter": { + "minProperties": 1, + "type": "object" + }, + "label_field": { + "minLength": 1, + "type": "string" + }, + "point_ids": { + "items": { + "type": [ + "string", + "integer" + ] + }, + "minItems": 1, + "type": "array" + }, + "point_layer": { + "minLength": 1, + "type": "string" + }, + "pre_service_stops": { + "$ref": "#/$defs/RepoShape2" + }, + "route_type": { + "default": "circuit", + "enum": [ + "circuit", + "tour", + "open_tour" + ], + "type": "string" + } + }, + "required": [ + "point_layer" + ], + "type": "object" + }, + "RepoShape2": { + "items": { + "$ref": "#/$defs/RepoShape3" + }, + "type": "array" + }, + "RepoShape3": { + "description": "Stop location resolved from a point layer in the TS or inline WGS84 coordinates (T-214).", + "oneOf": [ + { + "$ref": "#/$defs/RepoShape5" + }, + { + "$ref": "#/$defs/RepoShape4" + } + ] + }, + "RepoShape4": { + "additionalProperties": false, + "properties": { + "contractor_id": { + "minLength": 1, + "type": "string" + }, + "dwell_minutes": { + "minimum": 0, + "type": "number" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "label": { + "minLength": 1, + "type": "string" + }, + "latitude": { + "maximum": 90, + "minimum": -90, + "type": "number" + }, + "longitude": { + "maximum": 180, + "minimum": -180, + "type": "number" + }, + "name": { + "minLength": 1, + "type": "string" + }, + "stop_id": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "latitude", + "longitude" + ], + "type": "object" + }, + "RepoShape5": { + "additionalProperties": false, + "properties": { + "dwell_minutes": { + "minimum": 0, + "type": "number" + }, + "filter": { + "minProperties": 1, + "type": "object" + }, + "label_field": { + "minLength": 1, + "type": "string" + }, + "point_ids": { + "items": { + "type": [ + "string", + "integer" + ] + }, + "minItems": 1, + "type": "array" + }, + "point_layer": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "point_layer" + ], + "type": "object" + } +} - added
Input schema / properties / cadence_flexibility_pct / descriptionAdded value: +"Percent of an account's own cadence a single visit may drift so the number of work clusters stays comparable day to day. At the default 15 a 14-day account may slide two days and a 7-day account one; a 3-day account does not move. Set to 0 for strict cadence. A drift past this tolerance happens only to staff a day that would otherwise be short of work — an idle technician costs more than a visit arriving a day early — and every relaxed visit is reported in distribution_summary.cadence_relaxation and the visits layer's cadence_drift_days column." - changed
Input schema / properties / contractors / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "oneOf": [ + { + "$ref": "#/$defs/RepoShape1" + }, + { + "items": { + "oneOf": [ + { + "$ref": "#/$defs/RepoShape1" + }, + { + "additionalProperties": false, + "properties": { + "contractor_id": { + "minLength": 1, + "type": "string" + }, + "end": { + "$ref": "#/$defs/RepoShape3" + }, + "label": { + "minLength": 1, + "type": "string" + }, + "pre_service_stops": { + "$ref": "#/$defs/RepoShape2" + }, + "route_type": { + "default": "circuit", + "enum": [ + "circuit", + "tour", + "open_tour" + ], + "type": "string" + }, + "start": { + "$ref": "#/$defs/RepoShape3" + } + }, + "required": [ + "start" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "contractor_id": { + "minLength": 1, + "type": "string" + }, + "end": { + "$ref": "#/$defs/RepoShape3" + }, + "label": { + "minLength": 1, + "type": "string" + }, + "latitude": { + "maximum": 90, + "minimum": -90, + "type": "number" + }, + "longitude": { + "maximum": 180, + "minimum": -180, + "type": "number" + }, + "pre_service_stops": { + "$ref": "#/$defs/RepoShape2" + }, + "route_type": { + "default": "circuit", + "enum": [ + "circuit", + "tour", + "open_tour" + ], + "type": "string" + } + }, + "required": [ + "latitude", + "longitude" + ], + "type": "object" + } + ] + }, + "minItems": 1, + "type": "array" + } + ] + }, + { + "type": "null" + } +] - added
Input schema / properties / contractors / descriptionAdded value: +"Optional contractor anchoring (T-214). Takes a point-layer source (e.g. {point_layer: 'contractors'}) or a list of contractor entries with start, optional pre_service_stops (e.g. a depot with dwell_minutes), route_type (circuit|tour|open_tour), and optional end." - removed
Input schema / properties / contractors / titleRemoved value: -"Contractors" - changed
Input schema / properties / daily_capacity / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "hours": { + "exclusiveMinimum": 0, + "type": "number" + }, + "mode": { + "const": "not_to_exceed" + } + }, + "required": [ + "mode", + "hours" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "hours": { + "exclusiveMinimum": 0, + "type": "number" + }, + "mode": { + "const": "target_band" + }, + "tolerance_pct": { + "default": 10, + "maximum": 100, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "mode", + "hours" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } +] - added
Input schema / properties / daily_capacity / descriptionAdded value: +"Workload limit for one bucket (one technician-day). not_to_exceed is a hard ceiling the scheduler never breaches; target_band aims for the target and accepts anything inside the tolerance." - removed
Input schema / properties / daily_capacity / titleRemoved value: -"Daily Capacity" - added
Input schema / properties / emit_visit_layer / descriptionAdded value: +"Materialize one point per scheduled visit so color-by-day and the calculate_route handoff are single calls." - added
Input schema / properties / estimate_only / descriptionAdded value: +"When true, runs a fast capacity-planning preflight without mutating the Territory Solution or emitting a visits layer, returning capacity_plan (open_service_days, closed_days, required_daily_hours_avg, peak_day_floor_hours, min_resources_per_day, recommended_resources_per_day, and remedies)." - added
Input schema / properties / frequency_unit / descriptionAdded value: +"interval_days: the value is the maximum days between visits. visits_per_horizon: the value is how many visits the account gets across the whole horizon." - changed
Input schema / properties / horizon / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "mode": { + "const": "derived" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "days": { + "minimum": 1, + "type": "integer" + }, + "mode": { + "const": "explicit" + } + }, + "required": [ + "mode", + "days" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } +] - added
Input schema / properties / horizon / descriptionAdded value: +"Planning horizon. derived takes the longest interval among scheduled accounts; explicit is how a 28- or 42-day rolling cycle is requested when intervals leave a remainder on a shorter horizon." - removed
Input schema / properties / horizon / titleRemoved value: -"Horizon" - added
Input schema / properties / horizon_start_date / descriptionAdded value: +"Calendar date of horizon day 1. Required when visit_constraints is non-empty; without it dated constraints return CLARIFICATION_REQUIRED (needs_horizon_start_date). There is no default of today." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / max_buckets_per_day / descriptionAdded value: +"Cap on concurrent buckets in one day, normally the technician/contractor count (cannot exceed len(contractors) when contractors are supplied). Omitted with no contractors: one bucket per day; when that does not fit, CLARIFICATION_REQUIRED (blocked_by needs_technician_count) returns capacity_plan and asks how many technicians." - added
Input schema / properties / never_visit_values / descriptionAdded value: +"Frequency values that mean the account is left off the schedule. Matching accounts are excluded and reported in excluded_accounts, never silently dropped." - changed
Input schema / properties / objective / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "balance_bias": { + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "compactness_bias": { + "maximum": 100, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / objective / descriptionAdded value: +"Biases must sum to 100. Raising balance_bias to 100 lengthens otherwise efficient days to equalize hours, which is rarely what the customer wants." - removed
Input schema / properties / objective / titleRemoved value: -"Objective" - changed
Input schema / properties / point_filter / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": { + "anyOf": [ + { + "type": [ + "string", + "number", + "boolean" + ] + }, + { + "items": { + "type": [ + "string", + "number", + "boolean" + ] + }, + "minItems": 1, + "type": "array" + } + ] + }, + "minProperties": 1, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / point_filter / descriptionAdded value: +"Optional attribute filter (property -> value or list of values) to schedule a subset of point_layer." - removed
Input schema / properties / point_filter / titleRemoved value: -"Point Filter" - added
Input schema / properties / point_ids / descriptionAdded value: +"Optional list of account/point IDs to schedule." - added
Input schema / properties / tal_id / descriptionAdded value: +"Optional TAL id when filtering scheduled accounts by territory_id or territory_ids." - added
Input schema / properties / territory_id / descriptionAdded value: +"Optional leaf territory id or unique display label to schedule only accounts inside that territory polygon." - added
Input schema / properties / territory_ids / descriptionAdded value: +"Optional list of leaf territory ids or display labels to schedule only accounts inside those territory polygons." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - changed
Input schema / properties / visit_constraints / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": false, + "description": "One date constraint for an account, account_ids, or all accounts ('*'), resolved against horizon_start_date (T-213). blackout/no_service_window: forbidden dates (date, dates, a range, annual or weekly recurrence), always hard. fixed: a hard appointment that consumes a cadence visit. due: a deadline (optional earliest_date); hardness penalized (reported in constraint_summary.sla_violations) or hard. anchor: a date or weekday fixing the pattern phase. allowed_weekdays: visits land on those weekdays.", + "properties": { + "account_id": { + "minLength": 1, + "type": "string" + }, + "account_ids": { + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "date": { + "format": "date", + "type": "string" + }, + "dates": { + "items": { + "format": "date", + "type": "string" + }, + "type": "array" + }, + "earliest_date": { + "format": "date", + "type": "string" + }, + "end_date": { + "format": "date", + "type": "string" + }, + "hardness": { + "enum": [ + "hard", + "penalized" + ], + "type": "string" + }, + "kind": { + "enum": [ + "blackout", + "no_service_window", + "fixed", + "due", + "anchor", + "allowed_weekdays" + ], + "type": "string" + }, + "reason": { + "type": "string" + }, + "recurrence": { + "default": "none", + "enum": [ + "none", + "annual", + "weekly" + ], + "type": "string" + }, + "source": { + "type": "string" + }, + "start_date": { + "format": "date", + "type": "string" + }, + "weekday": { + "enum": [ + "mon", + "tue", + "wed", + "thu", + "fri", + "sat", + "sun" + ], + "type": "string" + }, + "weekdays": { + "items": { + "enum": [ + "mon", + "tue", + "wed", + "thu", + "fri", + "sat", + "sun" + ], + "type": "string" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / visit_constraints / descriptionAdded value: +"Separate account-keyed date-constraint dataset: blackouts/no-service windows, fixed dates, SLA due dates, anchor days, allowed weekdays. See visitConstraint." - removed
Input schema / properties / visit_constraints / titleRemoved value: -"Visit Constraints" - added
Input schema / properties / visit_frequency_field / descriptionAdded value: +"Numeric point column declared at ingest. Undeclared columns fail with UNDECLARED_FIELD." - added
Input schema / properties / visit_layer_name / descriptionAdded value: +"Defaults to <point_layer>_visits. This name is the schedule's identity: re-running with the same name replaces the layer in place, a different name adds a second schedule for comparison." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "account_count": { + "type": "integer" + }, + "buckets": { + "items": { + "type": "object" + }, + "type": "array" + }, + "capacity_plan": { + "type": "object" + }, + "constraint_summary": { + "type": "object" + }, + "contractors": { + "items": { + "type": "object" + }, + "type": "array" + }, + "creates_tal": { + "type": "boolean" + }, + "days": { + "items": { + "type": "object" + }, + "type": "array" + }, + "distribution_summary": { + "type": "object" + }, + "do_this_next": { + "type": "string" + }, + "download_url": { + "type": "string" + }, + "estimate_only": { + "type": "boolean" + }, + "excluded_accounts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "expires_at": { + "type": "string" + }, + "horizon_days": { + "type": "integer" + }, + "horizon_end_date": { + "type": "string" + }, + "horizon_fit": { + "type": "object" + }, + "horizon_mode": { + "type": "string" + }, + "horizon_start_date": { + "type": "string" + }, + "map_refresh": { + "type": "object" + }, + "next_tool": { + "type": "string" + }, + "point_layer": { + "type": "string" + }, + "schedule_artifact": { + "type": "object" + }, + "schedule_id": { + "type": "string" + }, + "schedule_label": { + "type": "string" + }, + "ts_handle": { + "type": "string" + }, + "ts_identity": { + "type": "object" + }, + "ts_omitted": { + "type": "object" + }, + "visit_count": { + "type": "integer" + }, + "visit_layer": { + "type": [ + "null", + "object" + ] + }, + "workload_model": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"schedule_visitsDictOutput"
- Changed
seed_build30 fields changed- added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / max_parts / descriptionAdded value: +"Safety cap on parts in the grown territory. Reaching it stops growth with target_status max_parts_reached." - changed
Input schema / properties / part_filter / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "minProperties": 1, + "properties": { + "county_name": { + "type": [ + "string", + "array" + ] + }, + "part_layer": { + "type": "string" + }, + "population": { + "oneOf": [ + { + "type": "number" + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "between": { + "items": { + "type": "number" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "eq": { + "type": "number" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + }, + "spatial": { + "additionalProperties": false, + "oneOf": [ + { + "required": [ + "bbox" + ] + }, + { + "required": [ + "geometry" + ] + } + ], + "properties": { + "bbox": { + "description": "[min_lon, min_lat, max_lon, max_lat] in EPSG:4326.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "geometry": { + "description": "GeoJSON Polygon or MultiPolygon in EPSG:4326.", + "type": "object" + }, + "operator": { + "enum": [ + "intersects", + "within", + "contains" + ], + "type": "string" + } + }, + "required": [ + "operator" + ], + "type": "object" + }, + "state_abbr": { + "type": [ + "string", + "array" + ] + }, + "territory": { + "additionalProperties": false, + "oneOf": [ + { + "required": [ + "ts_handle" + ] + }, + { + "required": [ + "map_session_id" + ] + } + ], + "properties": { + "include_descendants": { + "default": true, + "description": "When true, rollup territories include descendant leaf territory part_ids.", + "type": "boolean" + }, + "map_session_id": { + "description": "Open map session whose Territory Solution holds the TAL.", + "minLength": 1, + "type": "string" + }, + "tal_id": { + "minLength": 1, + "type": "string" + }, + "territory_id": { + "minLength": 1, + "type": "string" + }, + "ts_handle": { + "description": "Territory Solution reference (tsh_...) holding the TAL (no inline TS).", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "tal_id", + "territory_id" + ], + "type": "object" + }, + "text": { + "additionalProperties": false, + "properties": { + "case_sensitive": { + "default": false, + "type": "boolean" + }, + "field": { + "description": "Safe text field to search. Defaults to the public part ID column.", + "type": "string" + }, + "mode": { + "default": "prefix", + "enum": [ + "prefix", + "contains", + "exact" + ], + "type": "string" + }, + "value": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / part_filter / descriptionAdded value: +"Attribute filter resolved via query_parts (e.g. {\"state_abbr\": \"TX\"}). Implies part_scope explicit. Mutually exclusive with part_ids." - removed
Input schema / properties / part_filter / titleRemoved value: -"Part Filter" - added
Input schema / properties / part_ids / descriptionAdded value: +"Explicit eligible part set. Implies part_scope explicit. Mutually exclusive with part_filter." - added
Input schema / properties / part_layer / descriptionAdded value: +"Part layer to grow over, e.g. us_zips (ezt://part-layers). Required unless tal_id names a TAL that already has one; must match that TAL's layer when both are given." - added
Input schema / properties / part_scope / descriptionAdded value: +"Growth reads only the seed's neighbourhood (rings outward from the seed part), so this is an allowlist switch, not a performance prerequisite. explicit: confine growth to part_ids or part_filter (e.g. state_abbr TX) when the user wants the territory bounded by that geography. bbox_intersect / point_matched are accepted for compatibility with auto_build and ignored — seed_build never joins the whole point layer to the bbox parts." - added
Input schema / properties / point_layer / descriptionAdded value: +"Ingested point layer whose locations are counted or summed. Required when the TS has more than one point layer." - changed
Input schema / properties / seed / additionalPropertiesPrevious value: -trueNew value: +false - added
Input schema / properties / seed / descriptionAdded value: +"Where growth starts. For an address or POI, stage it as one row with request_account_upload, then geocode_address(upload_handle); a map click already gives coordinates." - added
Input schema / properties / seed / propertiesAdded value: +{ + "latitude": { + "maximum": 90, + "minimum": -90, + "type": "number" + }, + "longitude": { + "maximum": 180, + "minimum": -180, + "type": "number" + } +} - added
Input schema / properties / seed / requiredAdded value: +[ + "longitude", + "latitude" +] - removed
Input schema / properties / seed / titleRemoved value: -"Seed" - added
Input schema / properties / tal_id / descriptionAdded value: +"Existing TAL to append the new leaf to. Parts already assigned to any leaf of this TAL are never taken (the territory drifts instead). Without it, a new TAL is created." - added
Input schema / properties / tal_label / descriptionAdded value: +"Display name for the new TAL when tal_id is omitted. Ignored when tal_id is given." - changed
Input schema / properties / target / additionalPropertiesPrevious value: -trueNew value: +false - added
Input schema / properties / target / descriptionAdded value: +"What the territory grows toward. Fit is closest: |achieved - value| is minimized, so the result may land slightly under or over." - added
Input schema / properties / target / ifAdded value: +{ + "properties": { + "type": { + "const": "metric_sum" + } + } +} - added
Input schema / properties / target / propertiesAdded value: +{ + "field": { + "description": "Required for metric_sum. Must be a column declared in metric_fields (or workload_fields) at ingest; otherwise UNDECLARED_FIELD.", + "minLength": 1, + "type": "string" + }, + "type": { + "description": "location_count counts points in the point layer; metric_sum sums a declared numeric metric column.", + "enum": [ + "location_count", + "metric_sum" + ], + "type": "string" + }, + "value": { + "description": "Target count or target sum.", + "exclusiveMinimum": 0, + "type": "number" + } +} - added
Input schema / properties / target / requiredAdded value: +[ + "type", + "value" +] - added
Input schema / properties / target / thenAdded value: +{ + "required": [ + "field" + ] +} - removed
Input schema / properties / target / titleRemoved value: -"Target" - added
Input schema / properties / territory_name / descriptionAdded value: +"Display name for the new leaf. Defaults to the next free \"Territory N\" in the TAL. Must be unique within the TAL." - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - added
Input schema / properties / user_id / descriptionAdded value: +"Stable per-user label for usage and queue ordering." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "created_at": { + "type": "string" + }, + "do_this_next": { + "type": "object" + }, + "estimated_remaining_ms": { + "type": "integer" + }, + "estimated_start_ms": { + "type": "integer" + }, + "expires_at": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "next_poll_at": { + "type": "string" + }, + "phase": { + "type": "string" + }, + "poll_interval_ms": { + "type": "integer" + }, + "poll_loop": { + "type": "object" + }, + "progress": { + "type": "number" + }, + "queue_depth": { + "type": "integer" + }, + "queue_lane": {}, + "queue_position": { + "type": "integer" + }, + "recommended_poll_delay_ms": { + "type": "integer" + }, + "required_input": { + "type": "object" + }, + "result_resource_uri": { + "type": "string" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "status_resource_uri": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "tool_name": { + "type": "string" + }, + "total": { + "type": [ + "null", + "number" + ] + }, + "user_cancelled": { + "type": "boolean" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"seed_buildDictOutput"
- Changed
set_map_state8 fields changed- added
Input schema / properties / active_tal_id / descriptionAdded value: +"Alignment to make active on the open map (session only)." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization." - changed
Input schema / properties / pending_job_reference / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "job_id": { + "description": "Same value as task_id.", + "type": "string" + }, + "task_id": { + "type": "string" + }, + "tool_name": { + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / pending_job_reference / descriptionAdded value: +"Task reference (task_id from a build submission) the map follows and repaints from when the task completes." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"set_map_stateDictOutput"
- Changed
show_map_overlay10 fields changed- added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / overlay_id / descriptionAdded value: +"Canonical id: us_zips, accounts, tal-current, etc." - added
Input schema / properties / route_id / descriptionAdded value: +"With overlay_kind=route, targets one route instead of all of them. Without it, every route is re-pushed or cleared. Only re-shows or clears a route calculate_route already produced — it never routes." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - added
Input schema / properties / user_request / descriptionAdded value: +"Natural-language ask, e.g. 'add zips to the map'." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "delegated_tool": { + "type": [ + "null", + "string" + ] + }, + "do_this_next": { + "type": [ + "object", + "string" + ] + }, + "map_push_status": { + "type": "string" + }, + "overlay_id": { + "type": "string" + }, + "overlay_kind": { + "type": "string" + }, + "route_id": { + "type": [ + "null", + "string" + ] + }, + "route_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "type": "string" + }, + "ts_handle": { + "type": "string" + }, + "viewer_hint": { + "type": [ + "null", + "string" + ] + }, + "visibility": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"show_map_overlayDictOutput"
- Changed
submit_feedback9 fields changed- added
Input schema / properties / context_summary / descriptionAdded value: +"Optional sanitized summary only. Excludes credentials, API keys, raw customer data, private territory assignments, and PII." - added
Input schema / properties / correlation_id / descriptionAdded value: +"task_id, job_id, or request id the feedback is about." - added
Input schema / properties / session_id / descriptionAdded value: +"Client session id, if the host has one." - added
Input schema / properties / user_goal / descriptionAdded value: +"What the user was trying to accomplish, sanitized." - added
Input schema / properties / what_happened / descriptionAdded value: +"Where the agent struggled, failed, found confusing results, or used a workaround." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "feedback_id": { + "type": "string" + }, + "message": { + "type": "string" + }, + "received_at": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"submit_feedbackDictOutput"
- Changed
tasks_cancel4 fields changed- added
Input schema / properties / task_id / descriptionAdded value: +"task_id of the working task to stop." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "_meta": { + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "do_this_next": { + "type": "object" + }, + "lastUpdatedAt": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "next_poll_at": { + "type": "string" + }, + "phase": { + "type": "string" + }, + "pollInterval": { + "type": "integer" + }, + "poll_loop": { + "type": "object" + }, + "progress": { + "type": "number" + }, + "recommended_poll_delay_ms": { + "type": "integer" + }, + "sleep_ms": { + "type": "integer" + }, + "source_status": { + "type": "string" + }, + "status": { + "type": "string" + }, + "statusMessage": { + "type": "string" + }, + "taskId": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "ttl": { + "type": "integer" + } +} - removed
Output schema / titleRemoved value: -"tasks_cancelDictOutput"
- Changed
tasks_get5 fields changed- added
Input schema / properties / task_id / descriptionAdded value: +"task_id from the submitting tool's result (same value as job_id)." - added
Input schema / properties / wait_ms / descriptionAdded value: +"Optional milliseconds to hold on the server while the task is working so completed tasks return consume_result without an extra poll round-trip." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "_meta": { + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "do_this_next": { + "type": "object" + }, + "lastUpdatedAt": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "next_poll_at": { + "type": "string" + }, + "phase": { + "type": "string" + }, + "pollInterval": { + "type": "integer" + }, + "poll_loop": { + "type": "object" + }, + "progress": { + "type": "number" + }, + "recommended_poll_delay_ms": { + "type": "integer" + }, + "sleep_ms": { + "type": "integer" + }, + "source_status": { + "type": "string" + }, + "status": { + "type": "string" + }, + "statusMessage": { + "type": "string" + }, + "taskId": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "ttl": { + "type": "integer" + } +} - removed
Output schema / titleRemoved value: -"tasks_getDictOutput"
- Changed
tasks_result5 fields changed- added
Input schema / properties / task_id / descriptionAdded value: +"task_id whose status next_action is consume_result." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields.", + "properties": { + "do_this_next": { + "type": "object" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "sleep_ms": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"tasks_resultDictOutput"
- Changed
territory_merge16 fields changed- added
Input schema / properties / balance_tolerance / descriptionAdded value: +"Accepted for compatibility. The power-diagram rebalance converges on its own internal tolerance, so this value no longer gates per-part moves." - added
Input schema / properties / disruption_weight / descriptionAdded value: +"Incumbency stickiness for the warm-started power-diagram rebalance. 0 is a pure power re-solve (max balance, more churn); higher values keep more of the source alignment by requiring a neighbor territory to inflate further before it can claim a border part." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / new_tal_label / descriptionAdded value: +"Label for the derived TAL. Defaults to '<source label> (<operation>)'." - added
Input schema / properties / part_layer / descriptionAdded value: +"Part layer (e.g. us_zips). Required only when not inferable from the source TAL." - added
Input schema / properties / point_layer / descriptionAdded value: +"Optional point layer used to compute per-part workload/metric measures. When omitted, a uniform geography-only weighting is used." - added
Input schema / properties / source_tal_id / descriptionAdded value: +"Source TAL. Optional for form-capable clients that can answer via elicitation." - added
Input schema / properties / territory_id_a / descriptionAdded value: +"First territory (id or label). The merged territory keeps this identity." - added
Input schema / properties / territory_id_b / descriptionAdded value: +"Second territory (id or label). Must be adjacent to territory_id_a." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - added
Input schema / properties / visit_frequency_field / descriptionAdded value: +"Numeric visits-per-cycle column on the point layer. When omitted, inherits from source TAL build_provenance or point-layer metadata." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields.", + "properties": { + "balance_summary": { + "type": "object" + }, + "disruption_summary": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "expires_at": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "operation": { + "type": "string" + }, + "repair_summary": { + "type": "object" + }, + "sleep_ms": { + "type": "integer" + }, + "solver_diagnostics": { + "type": "object" + }, + "source_tal_id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "tal_id": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "territory_count": { + "type": "integer" + }, + "ts_handle": { + "type": "string" + }, + "ts_identity": { + "type": "object" + }, + "ts_omitted": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"territory_mergeDictOutput"
- Changed
territory_rebalance14 fields changed- added
Input schema / properties / balance_tolerance / descriptionAdded value: +"Accepted for compatibility. The power-diagram rebalance converges on its own internal tolerance, so this value no longer gates per-part moves." - added
Input schema / properties / disruption_weight / descriptionAdded value: +"Incumbency stickiness for the warm-started power-diagram rebalance. 0 is a pure power re-solve (max balance, more churn); higher values keep more of the source alignment by requiring a neighbor territory to inflate further before it can claim a border part." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / new_tal_label / descriptionAdded value: +"Label for the derived TAL. Defaults to '<source label> (<operation>)'." - added
Input schema / properties / part_layer / descriptionAdded value: +"Part layer (e.g. us_zips). Required only when not inferable from the source TAL." - added
Input schema / properties / point_layer / descriptionAdded value: +"Optional point layer used to compute per-part workload/metric measures. When omitted, a uniform geography-only weighting is used." - added
Input schema / properties / source_tal_id / descriptionAdded value: +"Source TAL. Optional for form-capable clients that can answer via elicitation." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - added
Input schema / properties / visit_frequency_field / descriptionAdded value: +"Numeric visits-per-cycle column on the point layer. When omitted, inherits from source TAL build_provenance or point-layer metadata." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields.", + "properties": { + "balance_summary": { + "type": "object" + }, + "disruption_summary": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "expires_at": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "operation": { + "type": "string" + }, + "repair_summary": { + "type": "object" + }, + "sleep_ms": { + "type": "integer" + }, + "solver_diagnostics": { + "type": "object" + }, + "source_tal_id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "tal_id": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "territory_count": { + "type": "integer" + }, + "ts_handle": { + "type": "string" + }, + "ts_identity": { + "type": "object" + }, + "ts_omitted": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"territory_rebalanceDictOutput"
- Changed
territory_split16 fields changed- added
Input schema / properties / balance_tolerance / descriptionAdded value: +"Accepted for compatibility. The power-diagram rebalance converges on its own internal tolerance, so this value no longer gates per-part moves." - added
Input schema / properties / disruption_weight / descriptionAdded value: +"Incumbency stickiness for the warm-started power-diagram rebalance. 0 is a pure power re-solve (max balance, more churn); higher values keep more of the source alignment by requiring a neighbor territory to inflate further before it can claim a border part." - added
Input schema / properties / map_session_id / descriptionAdded value: +"Open map session (msess_...) from get_map_visualization. Its Territory Solution is the input; omit ts_handle when set." - added
Input schema / properties / new_tal_label / descriptionAdded value: +"Label for the derived TAL. Defaults to '<source label> (<operation>)'." - added
Input schema / properties / new_territory_label / descriptionAdded value: +"Label for the second territory created by the split. Defaults to '<target> (split)'." - added
Input schema / properties / part_layer / descriptionAdded value: +"Part layer (e.g. us_zips). Required only when not inferable from the source TAL." - added
Input schema / properties / point_layer / descriptionAdded value: +"Optional point layer used to compute per-part workload/metric measures. When omitted, a uniform geography-only weighting is used." - added
Input schema / properties / source_tal_id / descriptionAdded value: +"Source TAL. Optional for form-capable clients that can answer via elicitation." - added
Input schema / properties / target_territory_id / descriptionAdded value: +"Leaf territory (id or label) to split into two. Optional when elicitation can fill it." - removed
Input schema / properties / tsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Ts" -} - added
Input schema / properties / ts_handle / descriptionAdded value: +"Territory Solution reference (tsh_...) from a build, ingest_accounts, import_geojson, import_designer_project, or get_map_visualization; Territory Solutions are not accepted inline." - added
Input schema / properties / visit_frequency_field / descriptionAdded value: +"Numeric visits-per-cycle column on the point layer. When omitted, inherits from source TAL build_provenance or point-layer metadata." - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true. A submission returns the task reference (task_id, next_action, sleep_ms); the completed task result carries the remaining fields.", + "properties": { + "balance_summary": { + "type": "object" + }, + "disruption_summary": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "expires_at": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "operation": { + "type": "string" + }, + "repair_summary": { + "type": "object" + }, + "sleep_ms": { + "type": "integer" + }, + "solver_diagnostics": { + "type": "object" + }, + "source_tal_id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "tal_id": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "terminal": { + "type": "boolean" + }, + "territory_count": { + "type": "integer" + }, + "ts_handle": { + "type": "string" + }, + "ts_identity": { + "type": "object" + }, + "ts_omitted": { + "type": "object" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"territory_splitDictOutput"
- Changed
workflow_advisor11 fields changed- changed
Input schema / properties / inputs / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "analysis_requested": { + "description": "realign: opt into post-edit Analyze even without a declared point layer (AN-004).", + "type": "boolean" + }, + "assignments_handle": { + "type": "string" + }, + "balance_metric": { + "type": "string" + }, + "destination_territory_id": { + "type": "string" + }, + "grouping_field": { + "type": "string" + }, + "moves": { + "description": "realign: explicit [{part_id, to_territory_id}] moves (skips map-selection steps).", + "type": "array" + }, + "new_tal_label": { + "type": "string" + }, + "new_territory_label": { + "type": "string" + }, + "operation": { + "description": "restructure: which restructure tool (default rebalance).", + "enum": [ + "split", + "merge", + "rebalance" + ], + "type": "string" + }, + "output_mode": { + "description": "For auto_build/account_build: return the default TAL or a downloadable assignments-only artifact.", + "enum": [ + "tal", + "assignments" + ], + "type": "string" + }, + "part_ids": { + "description": "realign: committed/explicit part ids for realign_operation.", + "items": { + "type": "string" + }, + "type": "array" + }, + "part_layer": { + "type": "string" + }, + "point_layer": { + "type": "string" + }, + "realign_operation": { + "description": "realign: preset op (e.g. assign_to_territory, remove_parts).", + "type": "string" + }, + "source_tal_id": { + "description": "restructure: source TAL.", + "type": "string" + }, + "tal_id": { + "description": "realign: TAL to edit.", + "type": "string" + }, + "tal_label": { + "type": "string" + }, + "target_territory_id": { + "description": "restructure split: territory to split.", + "type": "string" + }, + "target_workload": { + "exclusiveMinimum": 0, + "type": "number" + }, + "territory_count": { + "minimum": 1, + "type": "integer" + }, + "territory_id_a": { + "description": "restructure merge: first territory.", + "type": "string" + }, + "territory_id_b": { + "description": "restructure merge: second territory.", + "type": "string" + }, + "to_territory_id": { + "description": "realign: destination territory id.", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / inputs / descriptionAdded value: +"Optional plan parameters used to draft next_args." - removed
Input schema / properties / inputs / titleRemoved value: -"Inputs" - added
Input schema / properties / intent_category / descriptionAdded value: +"build_from_accounts | account_grouping | point_clustering | known_assignments | realign_existing | restructure | delete_territory | load_part_layer | reachable_area | seed_growth | coverage_gap_analysis | route_stops | routes_layer | delete_route | delete_point_layer | points_in_territory | periodic_scheduling. Tool names (auto_build, account_build, cluster_points, direct_build, isochrone_build, seed_build, analyze_network_coverage) are accepted as aliases; any other value returns the unsupported-category fallback." - changed
Input schema / properties / state / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "analysis_fresh": { + "type": "boolean" + }, + "analysis_panel_loaded": { + "type": "boolean" + }, + "analysis_requested": { + "description": "realign: user explicitly requested post-edit analysis; otherwise geography-only realign stops after the live map refresh.", + "type": "boolean" + }, + "expected_revision": { + "description": "realign: optimistic-concurrency revision.", + "type": [ + "integer", + "null" + ] + }, + "headless": { + "type": "boolean" + }, + "map_session_id": { + "type": [ + "string", + "null" + ] + }, + "part_layer": { + "type": [ + "string", + "null" + ] + }, + "point_layer": { + "type": [ + "string", + "null" + ] + }, + "realign_applied": { + "description": "realign: the realign mutation completed.", + "type": "boolean" + }, + "selection_committed": { + "description": "realign: parts committed on the map.", + "type": "boolean" + }, + "selection_requested": { + "description": "realign: a request_part_selection task exists.", + "type": "boolean" + }, + "selection_task_id": { + "description": "realign: id to poll with get_part_selection.", + "type": [ + "string", + "null" + ] + }, + "source_tal_id": { + "description": "restructure: source TAL.", + "type": [ + "string", + "null" + ] + }, + "tal_id": { + "description": "realign: TAL being edited.", + "type": [ + "string", + "null" + ] + }, + "tal_present": { + "type": "boolean" + }, + "ts_handle": { + "type": [ + "string", + "null" + ] + }, + "user_id": { + "type": [ + "string", + "null" + ] + }, + "viewer_connected": { + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / state / descriptionAdded value: +"Agent-supplied workflow state; all keys optional and default to 'not done yet'." - removed
Input schema / properties / state / titleRemoved value: -"State" - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "error": { + "description": "Present when ok is false.", + "properties": { + "ask_user": { + "items": { + "type": "string" + }, + "type": "array" + }, + "code": { + "type": "string" + }, + "details": { + "type": "object" + }, + "do_this_next": { + "type": "object" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "result": { + "description": "Present when ok is true.", + "properties": { + "blocked_by": { + "items": { + "type": "string" + }, + "type": "array" + }, + "build_tool": { + "type": [ + "null", + "string" + ] + }, + "done": { + "type": "boolean" + }, + "guidance": { + "type": [ + "null", + "object" + ] + }, + "guidance_uri": { + "type": "string" + }, + "intent_category": { + "type": "string" + }, + "invariants_enforced": { + "items": { + "type": "string" + }, + "type": "array" + }, + "missing_inputs": { + "items": { + "type": "string" + }, + "type": "array" + }, + "next_args": { + "type": "object" + }, + "next_tool": { + "type": [ + "null", + "string" + ] + }, + "note": { + "type": "string" + }, + "remaining_steps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "supported": { + "type": "boolean" + } + }, + "type": "object" + }, + "warnings": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } +} - added
Output schema / requiredAdded value: +[ + "ok" +] - removed
Output schema / titleRemoved value: -"workflow_advisorDictOutput"
7 tool updates
- Changed
account_build1 field changed- changed
Input schema / properties / output_mode / descriptionPrevious value: -"tal is the default. assignments returns assignments_artifact plus an authenticated download_url; no ts_handle, tal_id, or map_refresh."New value: +"tal is the default. assignments returns assignments_artifact plus an authenticated download_url and a key-less share_url; no ts_handle, tal_id, or map_refresh."
- Changed
auto_build1 field changed- changed
Input schema / properties / output_mode / descriptionPrevious value: -"tal is the default. assignments returns assignments_artifact plus an authenticated download_url; no ts_handle, tal_id, or map_refresh."New value: +"tal is the default. assignments returns assignments_artifact plus an authenticated download_url and a key-less share_url; no ts_handle, tal_id, or map_refresh."
- Added
import_designer_project - Changed
import_geojson2 fields changed- added
Input schema / properties / geojson_fileAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Geojson File" +} - added
Input schema / properties / upload_handleAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Upload Handle" +}
- Added
link_designer - Added
list_designer_projects - Added
push_to_designer
2 tool updates
- Changed
schedule_visits6 fields changed- added
Input schema / properties / estimate_onlyAdded value: +{ + "default": false, + "title": "Estimate Only", + "type": "boolean" +} - added
Input schema / properties / point_filterAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Point Filter" +} - added
Input schema / properties / point_idsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Point Ids" +} - added
Input schema / properties / tal_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Tal Id" +} - added
Input schema / properties / territory_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Territory Id" +} - added
Input schema / properties / territory_idsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Territory Ids" +}
- Changed
tasks_get1 field changed- added
Input schema / properties / wait_msAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Wait Ms" +}
2 tool updates
- Changed
configure_map1 field changed- added
Input schema / properties / themeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Theme" +}
- Changed
get_map_visualization1 field changed- added
Input schema / properties / themeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Theme" +}
6 tool updates
- Changed
auto_build1 field changed- changed
Input schema / properties / objective / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Balance objective: {metric: '<column>|__account_count__', workload_bias: 0..100, metric_bias: 0..100}. Biases sum to 100. For pure metric balance, pass {metric: '<column>', workload_bias: 0, metric_bias: 100} (or {metric: '<column>'} on restructure tools). When omitted on restructure tools, inherits the source TAL build_provenance objective or seed_build target.", + "properties": { + "metric": { + "description": "Point metric column name to balance (e.g. 'Revenue', 'weekly_volume'), or '__account_count__' for location-count balance.", + "type": "string" + }, + "metric_bias": { + "description": "Weight (0..100) on the metric or location-count dimension.", + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "workload_bias": { + "description": "Weight (0..100) on workload (drive time + dwell).", + "maximum": 100, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
cluster_points1 field changed- changed
Input schema / properties / objective / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Balance objective: {metric: '<column>|__account_count__', workload_bias: 0..100, metric_bias: 0..100}. Biases sum to 100. For pure metric balance, pass {metric: '<column>', workload_bias: 0, metric_bias: 100} (or {metric: '<column>'} on restructure tools). When omitted on restructure tools, inherits the source TAL build_provenance objective or seed_build target.", + "properties": { + "metric": { + "description": "Point metric column name to balance (e.g. 'Revenue', 'weekly_volume'), or '__account_count__' for location-count balance.", + "type": "string" + }, + "metric_bias": { + "description": "Weight (0..100) on the metric or location-count dimension.", + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "workload_bias": { + "description": "Weight (0..100) on workload (drive time + dwell).", + "maximum": 100, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
points_in_territory1 field changed- added
Input schema / properties / point_filterAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Point Filter" +}
- Changed
territory_merge1 field changed- changed
Input schema / properties / objective / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Balance objective: {metric: '<column>|__account_count__', workload_bias: 0..100, metric_bias: 0..100}. Biases sum to 100. For pure metric balance, pass {metric: '<column>', workload_bias: 0, metric_bias: 100} (or {metric: '<column>'} on restructure tools). When omitted on restructure tools, inherits the source TAL build_provenance objective or seed_build target.", + "properties": { + "metric": { + "description": "Point metric column name to balance (e.g. 'Revenue', 'weekly_volume'), or '__account_count__' for location-count balance.", + "type": "string" + }, + "metric_bias": { + "description": "Weight (0..100) on the metric or location-count dimension.", + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "workload_bias": { + "description": "Weight (0..100) on workload (drive time + dwell).", + "maximum": 100, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
territory_rebalance1 field changed- changed
Input schema / properties / objective / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Balance objective: {metric: '<column>|__account_count__', workload_bias: 0..100, metric_bias: 0..100}. Biases sum to 100. For pure metric balance, pass {metric: '<column>', workload_bias: 0, metric_bias: 100} (or {metric: '<column>'} on restructure tools). When omitted on restructure tools, inherits the source TAL build_provenance objective or seed_build target.", + "properties": { + "metric": { + "description": "Point metric column name to balance (e.g. 'Revenue', 'weekly_volume'), or '__account_count__' for location-count balance.", + "type": "string" + }, + "metric_bias": { + "description": "Weight (0..100) on the metric or location-count dimension.", + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "workload_bias": { + "description": "Weight (0..100) on workload (drive time + dwell).", + "maximum": 100, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
territory_split1 field changed- changed
Input schema / properties / objective / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Balance objective: {metric: '<column>|__account_count__', workload_bias: 0..100, metric_bias: 0..100}. Biases sum to 100. For pure metric balance, pass {metric: '<column>', workload_bias: 0, metric_bias: 100} (or {metric: '<column>'} on restructure tools). When omitted on restructure tools, inherits the source TAL build_provenance objective or seed_build target.", + "properties": { + "metric": { + "description": "Point metric column name to balance (e.g. 'Revenue', 'weekly_volume'), or '__account_count__' for location-count balance.", + "type": "string" + }, + "metric_bias": { + "description": "Weight (0..100) on the metric or location-count dimension.", + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "workload_bias": { + "description": "Weight (0..100) on workload (drive time + dwell).", + "maximum": 100, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
1 tool update
- Added
list_part_layers
1 tool update
- Changed
schedule_visits1 field changed- added
Input schema / properties / contractorsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Contractors" +}
4 tool updates
- Added
analyze_network_coverage - Changed
ingest_accounts5 fields changed- added
Input schema / properties / capacity_fieldAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Capacity Field" +} - added
Input schema / properties / layer_roleAdded value: +{ + "anyOf": [ + { + "enum": [ + "accounts", + "contractors" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Layer Role" +} - added
Input schema / properties / service_zip_fieldAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Service Zip Field" +} - added
Input schema / properties / tier_fieldAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Tier Field" +} - added
Input schema / properties / trade_fieldAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Trade Field" +}
- Added
points_in_territory - Changed
schedule_visits2 fields changed- added
Input schema / properties / horizon_start_dateAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Horizon Start Date" +} - added
Input schema / properties / visit_constraintsAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Visit Constraints" +}
10 tool updates
- Changed
analyze1 field changed- changed
Input schema / properties / dwell_time / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Onsite (dwell) time per visit: {type: 'scalar', value: <number>, unit: 'minutes'|'hours'} or {type: 'field', field: '<column>', unit: 'minutes'|'hours'}.", + "properties": { + "field": { + "description": "Point column name holding per-account onsite time when type='field'.", + "minLength": 1, + "type": "string" + }, + "type": { + "description": "Dwell source: 'scalar' for a fixed per-visit duration or 'field' for an ingested point column.", + "enum": [ + "scalar", + "field" + ], + "type": "string" + }, + "unit": { + "default": "minutes", + "description": "Time unit for value or field ('minutes' or 'hours').", + "enum": [ + "minutes", + "hours" + ], + "type": "string" + }, + "value": { + "description": "Confirmed onsite duration per visit when type='scalar'.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
analyze_routes1 field changed- changed
Input schema / properties / dwell_time / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Onsite (dwell) time per visit: {type: 'scalar', value: <number>, unit: 'minutes'|'hours'} or {type: 'field', field: '<column>', unit: 'minutes'|'hours'}.", + "properties": { + "field": { + "description": "Point column name holding per-account onsite time when type='field'.", + "minLength": 1, + "type": "string" + }, + "type": { + "description": "Dwell source: 'scalar' for a fixed per-visit duration or 'field' for an ingested point column.", + "enum": [ + "scalar", + "field" + ], + "type": "string" + }, + "unit": { + "default": "minutes", + "description": "Time unit for value or field ('minutes' or 'hours').", + "enum": [ + "minutes", + "hours" + ], + "type": "string" + }, + "value": { + "description": "Confirmed onsite duration per visit when type='scalar'.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
auto_build1 field changed- changed
Input schema / properties / dwell_time / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Onsite (dwell) time per visit: {type: 'scalar', value: <number>, unit: 'minutes'|'hours'} or {type: 'field', field: '<column>', unit: 'minutes'|'hours'}.", + "properties": { + "field": { + "description": "Point column name holding per-account onsite time when type='field'.", + "minLength": 1, + "type": "string" + }, + "type": { + "description": "Dwell source: 'scalar' for a fixed per-visit duration or 'field' for an ingested point column.", + "enum": [ + "scalar", + "field" + ], + "type": "string" + }, + "unit": { + "default": "minutes", + "description": "Time unit for value or field ('minutes' or 'hours').", + "enum": [ + "minutes", + "hours" + ], + "type": "string" + }, + "value": { + "description": "Confirmed onsite duration per visit when type='scalar'.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
calculate_route1 field changed- changed
Input schema / properties / dwell_time / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Onsite (dwell) time per visit: {type: 'scalar', value: <number>, unit: 'minutes'|'hours'} or {type: 'field', field: '<column>', unit: 'minutes'|'hours'}.", + "properties": { + "field": { + "description": "Point column name holding per-account onsite time when type='field'.", + "minLength": 1, + "type": "string" + }, + "type": { + "description": "Dwell source: 'scalar' for a fixed per-visit duration or 'field' for an ingested point column.", + "enum": [ + "scalar", + "field" + ], + "type": "string" + }, + "unit": { + "default": "minutes", + "description": "Time unit for value or field ('minutes' or 'hours').", + "enum": [ + "minutes", + "hours" + ], + "type": "string" + }, + "value": { + "description": "Confirmed onsite duration per visit when type='scalar'.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
cluster_points1 field changed- changed
Input schema / properties / dwell_time / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Onsite (dwell) time per visit: {type: 'scalar', value: <number>, unit: 'minutes'|'hours'} or {type: 'field', field: '<column>', unit: 'minutes'|'hours'}.", + "properties": { + "field": { + "description": "Point column name holding per-account onsite time when type='field'.", + "minLength": 1, + "type": "string" + }, + "type": { + "description": "Dwell source: 'scalar' for a fixed per-visit duration or 'field' for an ingested point column.", + "enum": [ + "scalar", + "field" + ], + "type": "string" + }, + "unit": { + "default": "minutes", + "description": "Time unit for value or field ('minutes' or 'hours').", + "enum": [ + "minutes", + "hours" + ], + "type": "string" + }, + "value": { + "description": "Confirmed onsite duration per visit when type='scalar'.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
create_territory_from_parts2 fields changed- changed
Input schema / properties / dwell_time / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Onsite (dwell) time per visit: {type: 'scalar', value: <number>, unit: 'minutes'|'hours'} or {type: 'field', field: '<column>', unit: 'minutes'|'hours'}.", + "properties": { + "field": { + "description": "Point column name holding per-account onsite time when type='field'.", + "minLength": 1, + "type": "string" + }, + "type": { + "description": "Dwell source: 'scalar' for a fixed per-visit duration or 'field' for an ingested point column.", + "enum": [ + "scalar", + "field" + ], + "type": "string" + }, + "unit": { + "default": "minutes", + "description": "Time unit for value or field ('minutes' or 'hours').", + "enum": [ + "minutes", + "hours" + ], + "type": "string" + }, + "value": { + "description": "Confirmed onsite duration per visit when type='scalar'.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / repair_policyAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Repair Policy" +}
- Changed
schedule_visits1 field changed- changed
Input schema / properties / dwell_time / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Onsite (dwell) time per visit: {type: 'scalar', value: <number>, unit: 'minutes'|'hours'} or {type: 'field', field: '<column>', unit: 'minutes'|'hours'}.", + "properties": { + "field": { + "description": "Point column name holding per-account onsite time when type='field'.", + "minLength": 1, + "type": "string" + }, + "type": { + "description": "Dwell source: 'scalar' for a fixed per-visit duration or 'field' for an ingested point column.", + "enum": [ + "scalar", + "field" + ], + "type": "string" + }, + "unit": { + "default": "minutes", + "description": "Time unit for value or field ('minutes' or 'hours').", + "enum": [ + "minutes", + "hours" + ], + "type": "string" + }, + "value": { + "description": "Confirmed onsite duration per visit when type='scalar'.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
territory_merge1 field changed- changed
Input schema / properties / dwell_time / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Onsite (dwell) time per visit: {type: 'scalar', value: <number>, unit: 'minutes'|'hours'} or {type: 'field', field: '<column>', unit: 'minutes'|'hours'}.", + "properties": { + "field": { + "description": "Point column name holding per-account onsite time when type='field'.", + "minLength": 1, + "type": "string" + }, + "type": { + "description": "Dwell source: 'scalar' for a fixed per-visit duration or 'field' for an ingested point column.", + "enum": [ + "scalar", + "field" + ], + "type": "string" + }, + "unit": { + "default": "minutes", + "description": "Time unit for value or field ('minutes' or 'hours').", + "enum": [ + "minutes", + "hours" + ], + "type": "string" + }, + "value": { + "description": "Confirmed onsite duration per visit when type='scalar'.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
territory_rebalance1 field changed- changed
Input schema / properties / dwell_time / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Onsite (dwell) time per visit: {type: 'scalar', value: <number>, unit: 'minutes'|'hours'} or {type: 'field', field: '<column>', unit: 'minutes'|'hours'}.", + "properties": { + "field": { + "description": "Point column name holding per-account onsite time when type='field'.", + "minLength": 1, + "type": "string" + }, + "type": { + "description": "Dwell source: 'scalar' for a fixed per-visit duration or 'field' for an ingested point column.", + "enum": [ + "scalar", + "field" + ], + "type": "string" + }, + "unit": { + "default": "minutes", + "description": "Time unit for value or field ('minutes' or 'hours').", + "enum": [ + "minutes", + "hours" + ], + "type": "string" + }, + "value": { + "description": "Confirmed onsite duration per visit when type='scalar'.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
territory_split1 field changed- changed
Input schema / properties / dwell_time / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Onsite (dwell) time per visit: {type: 'scalar', value: <number>, unit: 'minutes'|'hours'} or {type: 'field', field: '<column>', unit: 'minutes'|'hours'}.", + "properties": { + "field": { + "description": "Point column name holding per-account onsite time when type='field'.", + "minLength": 1, + "type": "string" + }, + "type": { + "description": "Dwell source: 'scalar' for a fixed per-visit duration or 'field' for an ingested point column.", + "enum": [ + "scalar", + "field" + ], + "type": "string" + }, + "unit": { + "default": "minutes", + "description": "Time unit for value or field ('minutes' or 'hours').", + "enum": [ + "minutes", + "hours" + ], + "type": "string" + }, + "value": { + "description": "Confirmed onsite duration per visit when type='scalar'.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "type": "null" + } +]
2 tool updates
- Added
delete_point_layer - Changed
ingest_accounts3 fields changed- added
Input schema / properties / label / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / label / defaultPrevious value: -"Accounts"New value: +null - removed
Input schema / properties / label / typeRemoved value: -"string"
1 tool update
- Changed
analyze1 field changed- changed
Input schema / properties / analysis_panel / anyOfPrevious value: -[ - { - "description": "single fills the open map's analysis dock with this result (needs map_session_id). comparison_slot fills the same dock (no side-by-side layout). none or omitted pushes nothing. Not the same enum as load_analysis_panel.presentation_mode (single|compare).", - "enum": [ - "none", - "single", - "comparison_slot" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "single fills the open map's analysis dock with this result (needs map_session_id). The dock shows one alignment at a time: with several tal_ids each TAL gets its own dock entry and the dock follows the map's active TAL. comparison_slot does the same and also returns cross_tal_comparison. none or omitted pushes nothing.", + "enum": [ + "none", + "single", + "comparison_slot" + ], + "type": "string" + }, + { + "type": "null" + } +]
37 tool updates
- Changed
account_build1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
analyze2 fields changed- changed
Input schema / properties / analysis_panel / anyOfPrevious value: -[ - { - "description": "single fills the open map's analysis dock with this result (pass map_session_id); prefer it. comparison_slot fills the same dock (no side-by-side layout). none or omitted pushes nothing. Not the same enum as load_analysis_panel.presentation_mode (single|compare).", - "enum": [ - "none", - "single", - "comparison_slot" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "single fills the open map's analysis dock with this result (needs map_session_id). comparison_slot fills the same dock (no side-by-side layout). none or omitted pushes nothing. Not the same enum as load_analysis_panel.presentation_mode (single|compare).", + "enum": [ + "none", + "single", + "comparison_slot" + ], + "type": "string" + }, + { + "type": "null" + } +] - removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
analyze_routes1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
auto_build1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
calculate_route1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
cluster_points1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
configure_map1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
create_territory_from_parts1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
delete_route1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
delete_tal1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
delete_territory1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
direct_build1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
ensure_map_viewer1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
export_geojson1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
extract_tal_branch1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
ezt1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
geocode_address1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
get_map_selection1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
get_map_visualization1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
get_part_selection1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
import_geojson1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
ingest_accounts1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
isochrone_build1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
load_analysis_panel1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
query_parts1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
realign1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
reintegrate_branch1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
request_account_upload1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
request_assignment_upload1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
request_part_selection1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
schedule_visits1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
seed_build1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
set_map_state1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
show_map_overlay1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
territory_merge1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
territory_rebalance1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
- Changed
territory_split1 field changed- removed
Input schema / properties / guidance_handleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Guidance Handle" -}
Related MCP Connectors
AI-ready GIS, geofencing, DataSynch, CRM, inventory, routing, APIs, telemetry and workflows.
Real-world location intelligence: foot traffic, trade areas, demographics, site scoring, and more.
Maps for agents: truck/ADR routing, geocoding, places, matrices, isochrones, EV and fleet planning.
US/Canada boundaries: cities, ZIPs, counties, districts, precincts. Lookups, crosswalks, GeoJSON.
Related MCP Servers
- FlicenseAqualityCmaintenancePlans and optimizes last-mile delivery routes with capacity and time-window constraints, offering tools for managing deliveries, vehicles, routes, and what-if scenarios.10-

Magic Lane MCP Serverofficial
AlicenseBqualityCmaintenanceEnables AI agents to become geospatially intelligent assistants with tools for location search, smart routing, round trip planning, reverse geocoding, isochrone analysis, route visualization, geofence management, and interactive map display.817 npm7Apache 2.0
ThinAir Geoofficial
AlicenseAqualityBmaintenanceLocation & routing intelligence for AI agents — geocoding, truck routing, traffic, weather, and place search.1932 npm1MIT- AlicenseAqualityDmaintenanceGeospatial API tools for AI agents — geocoding, reverse geocoding, routing, isochrone, distance matrix, static maps, H3 hexagons, elevation, GPS map-matching, point-in-polygon, address normalisation, timezone lookup, and batch geocoding. Built on OpenStreetMap infrastructure. Cost-effective alternative to Google Maps API.1839 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.