mcpbeat Sign in

EasyTerritory MCP Server

by easyterritory Your server? Claim it
answering

EasyTerritory MCP is answering right now. Last checked 3 min ago. It exposes 50 tools.

Build, balance, realign and analyze sales/service territories; geocode, route, schedule, live map.

Uptime history 18 days of history · worst day 98%
18 days agonow
100.0%
Uptime 24h
92 of 92 checks
50
Tools
read from the server
500 ms
Response time
average over 24h
open, no key
Access
streamable-http

What changed 138

Every tool that appeared, vanished or quietly changed what it asks for. Recorded since 5 October 2026. No other catalogue keeps this.

17 Oct 4 tool descriptions were rewritten discover_intent, ingest_accounts, schedule_visits and 1 more
17 Oct 2 tools appeared analyze_network_coverage, points_in_territory
17 Oct 2 tools changed the parameters they ask for ingest_accounts, schedule_visits
13 Oct 10 tools changed the parameters they ask for analyze, analyze_routes, auto_build and 7 more
12 Oct 3 tool descriptions were rewritten auto_build, ingest_accounts, show_map_overlay
12 Oct a tool appeared delete_point_layer
12 Oct a tool changed the parameters it asks for ingest_accounts
10 Oct a tool changed the parameters it asks for analyze
9 Oct 47 tool descriptions were rewritten account_build, analyze, analyze_routes and 44 more
9 Oct 37 tools changed the parameters they ask for account_build, analyze, analyze_routes and 34 more
and 30 more, back to 5 October 2026

Nothing serious here today

Today is the operative word: we check EasyTerritory MCP every 15 minutes and re-read its code on every release. Watch it and you find out the day that stops being true.

Three servers free · no card

Connect this server

Endpoint below is the one we actually reach during checks — not the one copied from a README. Last verified 3 min ago.

run in your terminal
claude mcp add ezt-mcp --transport http https://mcp.easyterritory.ai/
~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "ezt-mcp": {
      "url": "https://mcp.easyterritory.ai/"
    }
  }
}
~/.codex/config.toml
[mcp_servers.ezt-mcp]
url = "https://mcp.easyterritory.ai/"
.cursor/mcp.json
{
  "mcpServers": {
    "ezt-mcp": {
      "url": "https://mcp.easyterritory.ai/"
    }
  }
}
.vscode/mcp.json
{
  "mcpServers": {
    "ezt-mcp": {
      "url": "https://mcp.easyterritory.ai/"
    }
  }
}

Available tools 50

Read directly from the server with tools/list, grouped by what they act on. If a tool disappears, we record the date.

territory
create_territory_from_parts
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.
delete_territory
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, ts_handle, or ts. 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.
territory_merge
Merges a pair of adjacent territories and rebalances the rest of the alignment with minimal disruption (N to N-1 territories), e.g. when a rep leaves and the neighbors absorb the territory. territory_id_b is the territory that goes away; territory_id_a is an adjacent neighbor that keeps its id. The same job rebalances every remaining territory. One call removes one territory; non-adjacent ids return NON_ADJACENT_TERRITORIES. Needs source_tal_id and the Territory Solution from map_session_id, ts_handle, or ts; workload balance needs dwell_time (CLARIFICATION_REQUIRED otherwise). Writes a new derived alignment. Returns a task.
territory_rebalance
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, ts_handle, or ts. 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.
territory_split
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), ts_handle, or ts. 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).
analyze
analyze
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, ts, 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). territories[].workload_total is minutes; hours are in territory_metric_grids. Drive-time alignments count accounts inside each polygon. Returns a task.
analyze_network_coverage
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: <demand>_coverage (contractor_count, single_source, coverage_class red none / amber one / green 2+ / blue saturated, nearest contractor and minutes, capacity_ratio, gap score) and <demand>_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.
analyze_routes
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.
map
get_map_selection
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.
get_map_visualization
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, 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. 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.
set_map_state
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.
request
request_account_upload
Stages account rows for ingest_accounts and returns upload_handle, csv_headers, and suggested_ingest args with a geocode_plan. Four ways in: POST the CSV file to the returned upload_url (no API key; expires in 15 minutes; fastest for large files), csv_file (a host file parameter), csv_text (raw CSV, up to 16 MB, newlines preserved), or rows chunks appended with upload_handle. 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. The handle is single-use (claimed by ingest_accounts) and expires after 1 hour by default.
request_assignment_upload
Stages part-to-territory assignment rows (e.g. a ZIP-to-territory spreadsheet with Postal Code plus Territory/Region/Division) for direct_build and returns upload_handle. Same four ways in as request_account_upload: POST the file to upload_url (no API key; 15 minutes), csv_file, csv_text (newlines preserved), or assignment chunks appended with upload_handle. 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.
request_part_selection
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. A selection the person started from the map legend is read with get_map_selection.
tasks
tasks_cancel
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.
tasks_get
Tool equivalent of the native MCP tasks/get, listed for clients without the Tasks capability. Returns the Task status document for a task_id. 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.
tasks_result
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 when a handle exists. A build's ts_handle or task_id (as job_id) is the input analyze takes.
account
account_build
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.
auto
auto_build
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.
calculate
calculate_route
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). 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.
cluster
cluster_points
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 10,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.
configure
configure_map
Updates durable map settings on the Territory Solution and refreshes the live map: project_name (map heading), 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. classification without a point_layer is a project-level setting that does not color points. Input: map_session_id (the live map), ts_handle, or ts.
direct
direct_build
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 inline or as an assignments_handle (aup_...) from request_assignment_upload. 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.
discover
discover_intent
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.
ensure
ensure_map_viewer
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.
ep
ep_search
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'.
export
export_geojson
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 plus a download_url (GET with the API key; gzip unless zip=false), not an inline body. import_geojson reopens the file.
extract
extract_tal_branch
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.
ezt
ezt
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.
geocode
geocode_address
Geocodes a list of customer addresses to coordinates with match confidence, without loading them as a point layer. Accepts address/address_line1/street, city, state, and postal columns (common CRM 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 geocoded_rows, which ingest_accounts can load. ingest_accounts also geocodes on its own.
graph
ep_graph_traverse
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.
guidance
get_guidance
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.
import
import_geojson
Opens a GeoJSON FeatureCollection (plain points, or a territory file this server produced, plain or gzip/zip) as a Territory Solution and returns ts_handle and a summary. Input: geojson (object), geojson_text, or geojson_gzip (base64). Territory polygons without part_ids return TERRITORY_POLYGONS_WITHOUT_PART_IDS unless part_layer plus overlay_policy=centroid_within assigns parts by centroid. point_layer names imported points; tal_label names the alignment. EasyTerritory Designer projects (REST/Agent/Projects/{projectId}/TerritorySolution) import as geojson_gzip.
ingest
ingest_accounts
Account ingest: loads account or location 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 inline (rows) or as accounts_handle from request_account_upload for large files; a client file path is unreadable. 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. label defaults to the point_layer id in title case. Returns a task; the result reports failed_rows, map_refresh, and geocode quota shortfall.
isochrone
isochrone_build
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.
load
load_analysis_panel
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.
part
get_part_selection
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.
parts
query_parts
Returns attributes (no geometry) for parts of a part layer listed at 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.
point
delete_point_layer
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.
points
points_in_territory
Lists which account points from one point layer fall inside a territory polygon or a drive-time (isochrone) area: per territory, the point ids, full properties, point_count, and metric sums (metrics, else the layer's declared metric fields). Synchronous and read-only. Needs map_session_id or ts_handle. territory_id names one leaf (a stable territory_id or its exact unique display name); territory_ids names several; both omitted means every leaf in the TAL (tal_id, else the active or sole TAL). point_layer omitted uses the sole layer with points. A point counts in every containing polygon, and overlaps lists points in more than one. max_points caps the points listed per territory (default 1000, max 10000); counts and sums always cover every inside point. Unknown ids return UNKNOWN_TAL_ID / UNKNOWN_TERRITORY_ID / UNKNOWN_POINT_LAYER with the available values. Territory statistics without the point list come from analyze.
realign
realign
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), ts_handle, or ts; 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.
reintegrate
reintegrate_branch
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.
route
delete_route
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.
schedule
schedule_visits
Schedules recurring visits: expands each account's cadence (e.g. every 7 days, twice a month) across a horizon and packs the visits into daily work clusters (buckets) under a technician-day cap. Decides which day each visit happens (auto_build and cluster_points divide accounts among people instead); creates no alignment and assigns no technician. Needs point_layer (ingested, with the cadence column declared, else UNDECLARED_FIELD), visit_frequency_field, dwell_time, and daily_capacity (e.g. {mode: not_to_exceed, hours: 8}); missing dwell or capacity returns CLARIFICATION_REQUIRED with the question. frequency_unit: interval_days (max days between visits) or visits_per_horizon. never_visit_values (default 0, null, empty) are excluded and listed in excluded_accounts. bucket_workload_hours is in-bucket drive plus dwell, a different measure from territory workload and route_workload_hours. The same visit_layer_name replaces a schedule; a new name adds one. Returns a task. calculate_route over one bucket_id drives that day. Date limits use visit_constraints with horizon_start_date.
seed
seed_build
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: <declared metric>, 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.
show
show_map_overlay
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), ts_handle, or ts.
submit
submit_feedback
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.
tal
delete_tal
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.
topics
ep_list_topics
Lists EMEP topics grouped by type (concept, workflow, interface, troubleshooting, decision). Optional `type` filter.
workflow
workflow_advisor
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.

Endpoints

URLTransportStateLatencyChecked
https://mcp.easyterritory.ai/ streamable-http answering 490 ms 3 min ago

Alternatives to EasyTerritory MCP

same job, measured the same way
Wheremind
by wheremind

Hosted MCP for live place search, geocoding & turn-by-turn routes. No Maps API key to manage.

5 tools answering
Geoapify MCP by usefulapi
by usefulapi

Geocode, reverse-geocode, autocomplete, route and search places.

8 tools answering
EmbedEarth (E2)
by paulwxnter

Open-source Google Maps Platform alternative for agents: search, route, map, geocode, and compute.

45 installs/wk local only
InstaMaps
by get-instamaps

Geocode lists, measure, route drivers, check flood and crime risk, and map it, from spreadsheets.

answering
Mapsource OpenStreetMap & Geospatial APIs
by robit-man

OpenStreetMap queries, maps/styles, search, routing, terrain, analysis, pipelines, and rendering.

13 tools answering
AI SEO
by automatelab-tech

MCP server for AI-SEO auditing: schema, robots.txt, llms.txt, citation scoring, and AEO/GEO rewrites

65 installs/wk local only
Texas Treasure Map
by texastreasuremap

Estate sales around Dallas-Fort Worth, route planning between them, and Texas shopping guides.

5 tools answering
Rijwind
by rijwind

European maps, geocoding and routing: places, routes, travel times, reachable areas and maps.

answering

EasyTerritory MCP — questions

Answers built from our own checks of this server.

What can EasyTerritory MCP do?
It exposes 50 tools, read directly from the server on our last check. Among them: account_build, analyze, analyze_network_coverage, analyze_routes, auto_build, calculate_route and 44 more. The full list with descriptions is on this page — we take it from the server itself via tools/list, not from a README. How MCP servers expose tools in the first place →
What is EasyTerritory MCP mostly used for?
Its tools cluster around territory, tasks and analyze. That is what this server is built to work with — the grouping comes from the actual tool names, not from a category we assigned.
Is EasyTerritory MCP working right now?
We send a real MCP handshake every 15 minutes. Over the last 24 hours 92 of 92 checks got a reply (100.0%), average response time 500 ms. The bar chart above shows every period we have measured.
How do I connect EasyTerritory MCP?
Copy the ready config from this page — we generate it for Claude Code, Claude Desktop, Codex, Cursor and VS Code, each with the file path that client actually reads. It is a remote server, so there is nothing to install — the client connects to the address.
Does EasyTerritory MCP need an API key?
No. EasyTerritory MCP completed a full MCP handshake with us as an anonymous client and listed its tools without asking for anything. All 50 of them are readable on this page. This is what we observed, not what the docs claim.
How fast is EasyTerritory MCP?
It answers our handshake in 500 ms on average, which is faster than 23% of all working MCP servers we measure. That is on the slow side — worth knowing if the tool sits inside an interactive loop. The comparison comes from our own checks across the whole registry, every 15 minutes.