Skip to main content
Glama
Lavoiedavidw

Charlotte-Mecklenburg MCP Server

by Lavoiedavidw

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
geocodeA

Geocode a free-form address to lat/lon using the Esri World geocoder.

Args: address: Free-form address string, e.g. "2437 Remount Rd, Charlotte, NC".

Returns: Dict with matched address, lat, lon, match score, and a summary.

list_datasetsA

Search the Charlotte/Mecklenburg ArcGIS endpoint registry.

Use this to discover which layer to query before calling a spatial/attribute tool -- e.g. search "waste" to find the solid waste collection routes layer, or "parcel" for parcel/zoning data.

Args: keyword: Case-insensitive substring matched against service name, layer name, and field names/aliases. Omit to browse. source: Optional filter to one of "city-onprem", "county-onprem", "city-agol", "county-agol". limit: Maximum number of results to return (default 25).

Returns: Dict with a "results" list (service, service_type, layer_name, url, geometry_type, field_count, broken) and a "summary" line.

lookup_parcelA

Look up Mecklenburg County parcel(s) from the ParcelStatus layer.

Provide exactly one way to locate the parcel: an address (will be geocoded), explicit lat/lon, a pid (8-digit parcel ID), or an nc_pin (NC state parcel identification number).

Args: address: Free-form address, e.g. "2437 Remount Rd, Charlotte, NC". lat: Latitude in decimal degrees (WGS84). Requires lon. lon: Longitude in decimal degrees (WGS84). Requires lat. pid: Mecklenburg County parcel ID (e.g. "06705133"). nc_pin: NC state parcel identification number (e.g. "4534836016").

Returns: Dict with parcels (list of parcel attribute dicts), count, and a summary string.

get_zoningA

Get zoning classification for a parcel from Parcel_Zoning_Lookup.

Resolves a parcel (by address, lat/lon, or a known pid) against ParcelStatus first if a pid isn't supplied directly, then looks up its zoning record.

Args: address: Free-form address, e.g. "2437 Remount Rd, Charlotte, NC". lat: Latitude in decimal degrees (WGS84). Requires lon. lon: Longitude in decimal degrees (WGS84). Requires lat. pid: Mecklenburg County parcel ID, if already known.

Returns: Dict with zoning (dict of zoning attributes or None), resolved pid, and a summary string.

search_tax_foreclosuresA

Search active Mecklenburg County tax foreclosures.

All filters are optional and combined with AND; omit all to list foreclosures broadly (results are still capped by limit). nhood matches as a case-insensitive substring; zip and status match exactly (case-insensitive). Note: as of 2026-07-12 the status field is null on essentially every row in this dataset, so filtering by it will often return zero rows even when other filters would match — this is a data-population gap in the source, not a client bug.

Args: zip: 5-digit ZIP code, e.g. "28208". nhood: Neighborhood/subdivision name substring, e.g. "WESTCHESTER". status: Foreclosure status value, if populated for the record. limit: Max rows to return (default: all matches).

Returns: Dict with foreclosures (list of property dicts), count, and a summary string.

get_trash_scheduleA

Look up garbage, recycling, and yard waste collection schedule.

Provide either address (free-form string) or both lat and lon. Queries the City of Charlotte Solid Waste Collection polygon layer via point-in-polygon and returns per-stream day, provider, route, and (for recycling) the GREEN/ORANGE alternating week parsed from the route note.

Args: address: Free-form address, e.g. "2437 Remount Rd, Charlotte, NC". lat: Latitude, used with lon if address is not given. lon: Longitude, used with lat if address is not given.

Returns: Dict with garbage, recycling, yard_waste sub-dicts (each with day, provider, route, route_note, and for recycling recycling_week), plus lat, lon, resolved_address, and a human-readable summary.

crime_nearA

CMPD calls-for-service (patrol + domestic violence) near a point.

Provide either address (free-form string) or both lat and lon. CMPD_Calls_for_Service has no incident-level geometry — it is a monthly-aggregate table keyed by Neighborhood Profile Area (NPA). This tool resolves the NPA(s) near the point via nearby 311 request density (see module docstring), then sums CALL_COUNT by CALL_DESCRIPTION ("CMPD Patrol Calls For Service" / "CMPD DV Calls For Service") for months within days of now.

Args: address: Free-form address, e.g. "600 E 4th St, Charlotte, NC". lat: Latitude, used with lon if address is not given. lon: Longitude, used with lat if address is not given. radius_m: Radius in meters used to resolve nearby NPAs (default 800). days: Only include months within this many days of now (default 90). limit: Maximum number of raw NPA/month/category records to return (default 50); the breakdown totals cover all matching months, not just the returned records.

Returns: Dict with nearby_npas (NPA ids used), records (raw NPA/month/ category rows, capped at limit), breakdown (call description -> total count), total_calls, radius_m, days, lat, lon, resolved_address, and a summary.

homicides_nearA

Homicide incidents near a point, from the point-level CMPD_Homicide layer.

Provide either address (free-form string) or both lat and lon. Unlike the aggregate crime tables, CMPD_Homicide is a real point Feature Layer (public lat/lon per victim, since 2015), so this runs a genuine point+radius spatial query with a DATE_REPORTED where-clause. Homicides are rare, so defaults are wider (1600m / 365 days) than the other "near" tools; relax further for sparse areas.

Args: address: Free-form address, e.g. "600 E 4th St, Charlotte, NC". lat: Latitude, used with lon if address is not given. lon: Longitude, used with lat if address is not given. radius_m: Search radius in meters (default 1600). days: Only include homicides reported within this many days of now (default 365). limit: Maximum number of homicides to return (default 50).

Returns: Dict with homicides (list of dicts with crime_report_id, location, weapon, clearance_status, circumstances, ipv, npa, council_district, patrol_division, date_reported, clearance_date), count, breakdown (weapon -> count), radius_m, days, lat, lon, resolved_address, and summary.

violent_crime_nearA

CMPD violent-crime offense counts (Homicide/Rape/Robbery/Assault/...) near a point.

Provide either address (free-form string) or both lat and lon. Same shape/limitation as crime_near: ViolentCrimeData is a monthly-aggregate table keyed by Neighborhood Profile Area, not incident-level points, so nearby NPAs are resolved via 311 density (see module docstring) and OFFENSE_COUNT is summed by OFFENSE_DESCRIPTION for months within days of now.

Args: address: Free-form address, e.g. "600 E 4th St, Charlotte, NC". lat: Latitude, used with lon if address is not given. lon: Longitude, used with lat if address is not given. radius_m: Radius in meters used to resolve nearby NPAs (default 800). days: Only include months within this many days of now (default 180). limit: Maximum number of raw NPA/month/offense records to return (default 50); the breakdown totals cover all matching months.

Returns: Dict with nearby_npas, records (capped at limit), breakdown (offense description -> total count), total_offenses, radius_m, days, lat, lon, resolved_address, and a summary.

service_requests_nearA

311 service requests near a point, from the point-level ServiceRequests311 layer.

Provide either address (free-form string) or both lat and lon. Runs a point+radius spatial query, most recent first. Note: this layer has no open/closed "status" field — the closest available signal is INTERNAL_FIELD_OBSERVATION (a Y/N flag for whether the request originated from an internal field observation rather than a resident report), surfaced as field_observation below.

Args: address: Free-form address, e.g. "600 E 4th St, Charlotte, NC". lat: Latitude, used with lon if address is not given. lon: Longitude, used with lat if address is not given. radius_m: Search radius in meters (default 800). days: If given, only include requests received within this many days of now (default None: no date filter). limit: Maximum number of requests to return (default 50).

Returns: Dict with requests (list of dicts with request_type, title, department, division, received_date, field_observation, address, npa, council_district), count, breakdown (request_type -> count), radius_m, days, lat, lon, resolved_address, and summary.

get_planning_areaA

Look up the community planning area (and CCW planning region) at a point.

Provide either address (free-form string) or both lat and lon. Runs a point-in-polygon query against the city's Community_Planning_Areas layer (one of Charlotte's 15 named community planning areas, e.g. "West Inner", "Uptown") and the Center_Corridor_Wedge layer (finer "Center/Corridor/Wedge" planning region, e.g. "West Corridor").

Args: address: Free-form address, e.g. "2437 Remount Rd, Charlotte, NC". lat: Latitude, used with lon if address is not given. lon: Longitude, used with lat if address is not given.

Returns: Dict with planning_area (name + equity-index fields, or None if no polygon covers the point), planning_region (CCW name + location type, or None), lat, lon, resolved_address, and a human-readable summary.

rezonings_nearA

Find approved rezoning petitions near a point.

Provide either address (free-form string) or both lat and lon. Queries the city's Approved_Rezonings_since_2016__by_CCW point layer within radius_m meters, filtered to Decision = 'App' (the layer also carries deferred/withdrawn petitions despite its name), most recently approved first.

Args: address: Free-form address, e.g. "2437 Remount Rd, Charlotte, NC". lat: Latitude, used with lon if address is not given. lon: Longitude, used with lat if address is not given. radius_m: Search radius in meters (default 1600, roughly 1 mile). limit: Maximum number of rezonings to return (default 25).

Returns: Dict with rezonings (list of dicts with petition, petitioner, from_zone, to_zone, type, received_date, approved_date, decision, ccw_region, acres, petition_acres), count, radius_m, lat, lon, resolved_address, and a summary.

area_plans_atA

Find adopted area/small-area plan boundaries containing a point.

Provide either address (free-form string) or both lat and lon. Runs a point-in-polygon query against the city's Area_Plan_Boundaries layer; a point can fall inside more than one adopted plan boundary (overlapping study areas), so all matches are returned.

Args: address: Free-form address, e.g. "2437 Remount Rd, Charlotte, NC". lat: Latitude, used with lon if address is not given. lon: Longitude, used with lat if address is not given.

Returns: Dict with area_plans (list of dicts with plan_name, plan_type, district, adopt_date, adopt_year, acres, hyperlink), count, lat, lon, resolved_address, and a summary.

bike_lanes_nearA

Find bike lanes near an address or coordinate.

Args: address: Free-form address, e.g. "600 E 4th St, Charlotte, NC". Provide this OR lat/lon. lat: Latitude, used with lon instead of address. lon: Longitude, used with lat instead of address. radius_m: Search radius in meters (default 800).

Returns: Dict with the resolved location, a list of bike lane segments (street, lane type, side of street, width, year built, notes), and a "summary" sentence.

ada_features_nearA

Find ADA pedestrian infrastructure near an address or coordinate.

Covers curb ramps, on-street accessible parking spaces, and accessible pedestrian signals from the city's ADA self-evaluation dataset.

Args: address: Free-form address. Provide this OR lat/lon. lat: Latitude, used with lon instead of address. lon: Longitude, used with lat instead of address. radius_m: Search radius in meters (default 400). feature_type: Which ADA feature types to return: "all" (default), "ramps", "parking", or "signals".

Returns: Dict with the resolved location, lists under "ramps", "parking", and/or "signals" (only the requested types are populated), and a "summary" sentence.

cip_projects_nearA

Find Mecklenburg County Capital Improvement Projects (stormwater) near an address or coordinate.

Covers Charlotte-Mecklenburg Storm Water Services projects: drainage improvements, stream & wetland restoration, and pollutant removal — both active and completed.

Args: address: Free-form address. Provide this OR lat/lon. lat: Latitude, used with lon instead of address. lon: Longitude, used with lat instead of address. radius_m: Search radius in meters (default 1600).

Returns: Dict with the resolved location, a list of CIP projects (name, status, phase, type, fiscal-year-complete), and a "summary".

cats_projects_nearA

Find CATS (Charlotte Area Transit System) capital projects near an address or coordinate.

Queries both the point layer (e.g. stations) and the line layer (e.g. transit corridors/tracks) and merges the results.

Args: address: Free-form address. Provide this OR lat/lon. lat: Latitude, used with lon instead of address. lon: Longitude, used with lat instead of address. radius_m: Search radius in meters (default 1600).

Returns: Dict with the resolved location, a list of CATS projects (name, description, funding status, geometry type), and a "summary".

brownfields_nearA

Find recorded brownfield sites within a radius of a location.

Queries the Mecklenburg County recorded brownfields point layer (NC Brownfields Program). Provide either address or both lat/lon.

Args: address: Free-form address, e.g. "2437 Remount Rd, Charlotte, NC". lat: Latitude, used with lon if address is not given. lon: Longitude, used with lat if address is not given. radius_m: Search radius in meters (default 1600m, ~1 mile).

Returns: Dict with brownfields (list of name/status/address/city/acreage/ distance_m), count, lat, lon, resolved_address, and summary.

watershed_atA

Look up the named watershed/basin containing a location.

Point-in-polygon query against the City of Charlotte "Watershed Basins" layer, which covers all of Mecklenburg County. Provide either address or both lat/lon.

Args: address: Free-form address, e.g. "2437 Remount Rd, Charlotte, NC". lat: Latitude, used with lon if address is not given. lon: Longitude, used with lat if address is not given.

Returns: Dict with watershed (name/tile_name/basin_index), lat, lon, resolved_address, and summary.

tree_canopy_atA

Get tree canopy stats for the area containing a location.

Point-in-polygon query against the joint City of Charlotte / TreesCharlotte 2022 tree canopy assessment layer, which stacks multiple geography levels (Neighborhood Profile Area, Council District, Jurisdiction, County, ...) for the same point. The finest available level is returned as primary (Neighborhood Profile Area preferred, per plan); all matched levels are included under by_geography for context. Provide either address or both lat/lon.

Args: address: Free-form address, e.g. "2437 Remount Rd, Charlotte, NC". lat: Latitude, used with lon if address is not given. lon: Longitude, used with lat if address is not given.

Returns: Dict with primary (geography/value/canopy_percent/canopy_acres/ vegetation_percent/impervious_percent), by_geography (all matched levels), lat, lon, resolved_address, and summary.

battery_recycling_sites_nearA

Find battery/household-hazardous-waste recycling drop-off sites near a location.

Queries the Mecklenburg County recycling drop-off centers point layer (batteries are one of several accepted materials at these sites; there is no battery-specific kiosk layer published). Provide either address or both lat/lon.

Args: address: Free-form address, e.g. "2437 Remount Rd, Charlotte, NC". lat: Latitude, used with lon if address is not given. lon: Longitude, used with lat if address is not given. radius_m: Search radius in meters (default 8000m, ~5 miles — sites are sparse, only 5 exist countywide).

Returns: Dict with sites (list of name/address/hours/description/ distance_m), count, lat, lon, resolved_address, and summary.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Lavoiedavidw/Charlotte-City-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server