Charlotte Open Data MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_address_profileA | Everything that serves or governs a location, in one call. Returns city council district and representative, county commissioner, CMPD patrol division, first-due fire station, trash/recycling/yard-waste days, zoning, FEMA flood zone, historic district, ZIP code, and tax parcel ID. |
| lookup_addressB | Find an address in Mecklenburg County's official master address list. Returns matches with coordinates, tax parcel ID, municipality, and ZIP code. |
| get_trash_and_recycling_scheduleB | Garbage, recycling, and yard-waste collection days for an address in Charlotte. |
| get_crime_nearA | CMPD police incident reports near a location: counts by offense and the latest reports. Answers "is there much crime near 123 Main St?" or "any car break-ins near me lately?". |
| summarize_crimeA | Citywide CMPD incident counts grouped by offense, division, year, or neighborhood. Use group_by='year' with an offense filter for trends, e.g. robberies per year since 2017. |
| get_traffic_crashes_nearA | Reported traffic crashes near a location, with counts by severity. Useful for "is this intersection dangerous?" or traffic-calming requests. |
| get_311_requests_nearA | 311 service requests reported near a location, with counts by request type. Shows whether a problem (pothole, missed pickup, dumping, streetlight) was already reported. |
| get_code_enforcement_casesB | Housing and neighborhood code enforcement cases at or near an address. Covers nuisance (junk, overgrown lots), minimum housing, zoning, graffiti, and parking violations. Useful for renters, buyers, and neighbors. |
| get_street_closuresA | Street and lane closures and detours published by CDOT, citywide or near a location. |
| get_capital_projects_nearB | City capital projects (roads, sidewalks, parks, facilities) near a location. Includes phase, schedule, budget, and the project manager's contact information. |
| get_pending_rezoningsB | Rezoning petitions currently in process, citywide or near a location. Shows the petitioner, existing and requested zoning, acreage, and a link to the petition. |
| find_nearby_placesA | Nearest public places of one type, sorted by straight-line distance. Categories include libraries, public schools, parks, greenways, fire and police stations, post offices, pharmacies, grocery stores, medical facilities, child care, EV chargers, park-and-ride lots, light rail stations, bus stops, YMCAs, places of worship, and public Wi-Fi. Bus stop IDs can be used with CATS real-time arrival services. |
| get_bus_routeA | CATS bus routes with scheduled frequency (minutes between buses) by time of day. For stops near an address use find_nearby_places with category 'bus_stop'. |
| get_city_budgetB | City of Charlotte budget totals for a fiscal year by department, fund, or expense type. |
| get_city_salary_statsA | Pay statistics for City of Charlotte employees: head count and annual pay rates. Aggregated by department or job title for one quarter (the latest by default); individual employees are not listed. |
| search_datasetsA | Search the Charlotte Open Data Portal catalog (about 380 datasets) by keyword. Use this to find data the purpose-built tools don't cover. Pass a result's layer_url to describe_dataset, query_dataset, or summarize_dataset. |
| describe_datasetA | Show a dataset layer's description, record count, and fields. Call this before query_dataset or summarize_dataset to learn field names and types. |
| query_datasetB | Fetch records from any portal dataset layer with a SQL filter, optionally near a place. |
| summarize_datasetA | Count or aggregate any portal dataset server-side, grouped by up to three fields. Answers questions like "how many 311 requests of each type were made in ZIP 28205?". Rows are sorted by the statistic, largest first, in a column named stat_value. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 19 tools
Most tools map to distinct data domains (311, crime, crashes, budget, etc.), but get_address_profile duplicates several specialized capabilities—especially trash/recycling schedule—and the generic query_dataset/summarize_dataset can answer questions also covered by purpose-built tools. Descriptions provide guidance (e.g., search_datasets says to use purpose-built tools first), so misselection risk is moderate but present.
All 19 tools use snake_case with a verb-first pattern (get_, lookup_, summarize_, find_, search_, describe_, query_), and resource names are clear and predictable. Minor verb variety (get vs lookup vs find) is semantically appropriate and does not break consistency.
19 tools is on the higher side but justified by the breadth of Charlotte open data (address, transit, safety, budget, etc.) plus a generic dataset access layer. Each tool targets a distinct data type, though the composite address profile and generic trio create some redundancy.
The surface covers major city data domains and the generic search/describe/query/summarize tools allow access to any of ~380 portal datasets, so agents can answer most questions without dead ends. Minor gaps include real-time transit arrivals and a dedicated bus stop tool (handled indirectly via find_nearby_places), but overall coverage is strong.