occ-gis-mcp
occ-gis-mcp
Un servidor MCP (Model Context Protocol) que da a los asistentes de IA (como Claude, GitHub Copilot o cualquier cliente compatible con MCP) acceso a conjuntos de datos GIS públicos del hub de datos abiertos de la Oklahoma Corporation Commission: https://gisdata-occokc.opendata.arcgis.com/
No se requiere experiencia en programación para configurarlo. Sigue los pasos a continuación en orden.
¿Qué es esto, en términos sencillos?
MCP («Model Context Protocol») es una forma estándar de que las herramientas de chat con IA llamen a pequeños programas («servidores») que obtienen datos en vivo. Este repo es uno de esos servidores. Una vez configurado, puedes preguntarle a tu asistente de IA cosas como:
"Lista los conjuntos de datos disponibles en el hub GIS de la OCC"
"Encuentra todos los pozos de petróleo activos en el condado de Oklahoma"
"Muéstrame los campos disponibles en la capa PST Tanks"
y el asistente usará este servidor para obtener respuestas reales y en vivo en lugar de adivinar.
Related MCP server: mcp-arcgis-houston
Paso 1 — Instalar Node.js
Este servidor se ejecuta en Node.js. Si aún no lo tienes:
Ve a https://nodejs.org
Descarga la versión LTS (Long Term Support) para tu sistema operativo.
Ejecuta el instalador y acepta los valores predeterminados.
Confirma que funciona abriendo una terminal (PowerShell en Windows, Terminal en Mac/Linux) y ejecutando:
node -v npm -v
Ambos deberían mostrar un número de versión (p. ej., v20.11.0). Si ves un error, reinicia la terminal/ordenador y vuelve a intentarlo.
Paso 2 — Descargar este proyecto
Opción A: Usar Git (recomendado si lo tienes)
git clone https://github.com/MSPFE2019/occ-gis-mcp.git
cd occ-gis-mcpOpción B: Sin Git
Haz clic en el botón verde Code → Download ZIP
Descomprímelo en un lugar que recuerdes (p. ej., tu carpeta Documentos)
Abre una terminal y
cda esa carpeta descomprimida, por ejemplo:cd "C:\Users\YourName\Documents\occ-gis-mcp"
Paso 3 — Instalar las dependencias
Dentro de la carpeta del proyecto, ejecuta:
npm installEsto descarga las pequeñas bibliotecas que el servidor necesita. Solo necesitas hacerlo una vez (y de nuevo cada vez que cambie el código).
Paso 4 — Probar que funciona
Hay dos formas de ejecutar este servidor — elige según dónde lo vayas a usar:
index.js— para herramientas locales de escritorio (Claude Desktop, VS Code/Copilot Chat).http.js— para herramientas remotas/de nube como Copilot Studio (consulta la sección dedicada más abajo).
Prueba primero el local:
node index.jsNo se imprimirá nada: ¡es lo esperado! Los servidores MCP se comunican a través de un canal silencioso de entrada/salida y solo esperan a que un cliente se conecte. Pulsa Ctrl+C para detenerlo.
Para una prueba más visual, usa el Inspector MCP oficial, que abre una página del navegador donde puedes hacer clic en botones y ver resultados en vivo:
npx @modelcontextprotocol/inspector node index.jsEsto abre una página web local. Haz clic en Connect, luego en List Tools y después intenta ejecutar list_datasets sin argumentos — deberías ver una lista de conjuntos de datos reales devuelta como JSON. Si funciona, el servidor está funcionando correctamente.
Paso 5 — Conéctalo a tu asistente de IA
Los servidores MCP se configuran una vez dentro de los ajustes de tu cliente de IA. Elige la guía que coincida con tu herramienta:
Claude Desktop
Abre Claude Desktop → Settings → Developer → Edit Config (esto abre
claude_desktop_config.jsonen un editor de texto).Añade una entrada como esta (sustituye la ruta por la carpeta real de tu proyecto, usando dobles barras invertidas
\\en Windows):{ "mcpServers": { "occ-gis": { "command": "node", "args": ["C:\\Users\\YourName\\Documents\\occ-gis-mcp\\index.js"] } } }Guarda el archivo y reinicia Claude Desktop por completo.
Pregúntale: "¿Qué conjuntos de datos GIS de la OCC están disponibles?"
VS Code (GitHub Copilot Chat) u otros editores compatibles con MCP
Abre (o crea) un archivo
mcp.jsonen tus ajustes de MCP (en VS Code: Paleta de comandos → "MCP: Open User Configuration", o añádelo a.vscode/mcp.jsonde tu espacio de trabajo).Añade el mismo bloque
mcpServersque se muestra arriba.Recarga la ventana y las nuevas herramientas aparecerán cuando chatees con Copilot.
Cualquier otro cliente MCP
Cualquier cliente que admita el estándar MCP acepta la misma forma de configuración: un command (node) y args (la ruta completa a index.js). Consulta la documentación de tu cliente para saber dónde se encuentra ese archivo de configuración.
Herramientas disponibles
Una vez conectado, tu asistente puede llamar a estas:
Tool | What it does |
| Busca/lista los conjuntos de datos del hub (pozos, tanques, etc.). |
| Detalles completos de un conjunto de datos por título, incluidos enlaces de descarga (CSV, GeoJSON, Shapefile, KML, File Geodatabase) y su URL de servicio ArcGIS en vivo. |
| Nombres de campos, tipo de geometría y extensión para una URL de capa ArcGIS dada. |
| Ejecuta consultas de atributos ( |
Personalizar para un sitio de ArcGIS Hub diferente
Este servidor no se limita a los datos de la OCC: funciona con cualquier sitio de ArcGIS Hub que exponga un feed de catálogo DCAT-US (la mayoría de los sitios públicos de ArcGIS Hub lo hacen). Para apuntarlo a un sitio diferente, abre server.js y cambia esta línea cerca del principio:
const HUB_BASE = "https://gisdata-occokc.opendata.arcgis.com";por la URL base de tu sitio de destino y vuelve a ejecutar el servidor. Todo lo demás (nombres de herramientas, lógica de consulta) funciona igual.
Conexión con Microsoft Copilot Studio
Copilot Studio no ejecuta este servidor por ti; necesita alcanzarlo a través de internet como una URL HTTPS. Para eso sirve http.js (a diferencia de index.js, que es solo para herramientas locales como Claude Desktop). Hay dos partes: (A) colocar el servidor en algún lugar accesible desde internet y luego (B) registrarlo en Copilot Studio.
A. Desplegar el servidor HTTP en un lugar público
Elige la opción que te resulte más fácil: todas ejecutan el mismo comando: npm install y luego npm run start:http.
Lo más fácil para principiantes — Azure App Service (o Azure Container Apps)
Sube este repo a tu propia cuenta de GitHub (ya está hecho si estás leyendo esto desde tu fork/copia).
En Azure Portal, crea una Web App → Runtime stack: Node 20 LTS → despliega desde tu repositorio de GitHub (Azure configura CI/CD por ti).
En Configuration → Startup Command, establece:
node http.jsUna vez desplegado, Azure te da una URL como
https://occ-gis-mcp.azurewebsites.net. Tu endpoint MCP es esa URL más/mcp, por ejemplohttps://occ-gis-mcp.azurewebsites.net/mcp.
También sencillo — Render, Railway o Fly.io
Cualquiera de ellos puede desplegar un repo de Node.js desde GitHub en unos pocos clics:
Comando de compilación:
npm installComando de inicio:
npm run start:httpTe darán una URL pública
https://...; de nuevo, añade/mcp.
Solo para pruebas locales (no para producción)
npm install
npm run start:httpEsto inicia el servidor en http://localhost:3000/mcp. Para probar si Copilot Studio (un servicio en la nube) puede acceder a un servidor en tu propia máquina, necesitarías una herramienta de túnel como ngrok (ngrok http 3000), que te da una URL HTTPS pública temporal. Esto está bien para una demo rápida, no para un uso real o continuado.
B. Registrarlo en Copilot Studio
Abre tu agente en Copilot Studio → ve a Tools (o Actions) → Add a tool → New tool → Model Context Protocol.
Ponle un nombre (p. ej., "OCC GIS Data") y pega la URL HTTPS de tu servidor incluyendo
/mcp, p. ej.https://occ-gis-mcp.azurewebsites.net/mcp.Elige No authentication (este servidor es de solo lectura y no requiere credenciales) a menos que hayas añadido tu propia capa de autenticación delante.
Guarda. Copilot Studio llamará al servidor y descubrirá automáticamente las cuatro herramientas (
list_datasets,get_dataset,get_layer_metadata,query_layer) junto con sus descripciones: no es necesario introducir ningún esquema manualmente.Pruébalo en el panel de chat de prueba de Copilot Studio: pregunta "¿Qué conjuntos de datos GIS de la OCC están disponibles?" o "Encuentra pozos activos en el condado de Oklahoma".
Herramientas disponibles
Una vez conectado, tu asistente puede llamar a estas:
Tool | What it does |
| Busca/lista los conjuntos de datos del hub (pozos, tanques, etc.). |
| Detalles completos de un conjunto de datos por título, incluidos enlaces de descarga (CSV, GeoJSON, Shapefile, KML, File Geodatabase) y su URL de servicio ArcGIS en vivo. |
| Nombres de campos, tipo de geometría y extensión para una URL de capa ArcGIS dada. |
| Ejecuta consultas de atributos ( |
Solución de problemas
node: command not found— Node.js no está instalado o tu terminal necesita reiniciarse después de la instalación. Repite el Paso 1.Errores del Inspector/llamadas a herramientas que mencionen network/fetch — comprueba tu conexión a internet; el servidor llama a la API en vivo de ArcGIS Hub en cada solicitud.
El asistente no ve las nuevas herramientas — verifica que la ruta del archivo (local) o la URL (Copilot Studio) sea correcta y que hayas reiniciado/reconectado el cliente por completo.
Copilot Studio dice que no puede conectarse — asegúrate de haber registrado la URL terminada en
/mcp(no solo el dominio desnudo), de que el despliegue se está ejecutando realmente y de que es accesible a través de HTTPS normal (sin VPN/cortafuegos que lo bloqueen).
Notas
La lista de conjuntos de datos se obtiene en vivo del feed de catálogo DCAT-US del hub y se almacena en caché durante 15 minutos para mantener la velocidad.
Los datos son públicos pero están sujetos a los términos de uso de la agencia de origen (se muestran en el campo de licencia de la salida de
get_dataset).http.jsse ejecuta en modo sin estado (un servidor nuevo por solicitud), lo que simplifica el alojamiento y es totalmente compatible con la forma en que Copilot Studio llama a las herramientas MCP.
Available Tools
4 toolsget_datasetGet OCC GIS dataset detailsA
Get full details for one dataset on the OCC GIS hub by exact or partial title match, including every distribution (ArcGIS REST service URL, CSV/GeoJSON/Shapefile/KML/FileGDB download links), spatial extent, and license text.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Dataset title or a distinctive substring of it, e.g. 'RBDMS WELLS' or 'PST Tanks' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It does disclose the returned content and the exact/partial matching behavior, which is useful. However, it does not mention how ambiguous partial matches are handled (e.g., multiple matches, error vs. arbitrary selection), nor any potential side effects or permissions, leaving some behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the action, scope, and key return details without redundancy or filler. Every clause contributes useful information, and it is easily scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (one parameter, no output schema), the description is reasonably complete: it covers purpose, matching behavior, and enumerates the returned information. The only notable omission is clarifying behavior when a partial title matches multiple datasets, but this does not severely undermine usability.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes the 'title' parameter with examples and the note about distinctive substrings. The tool description adds 'exact or partial title match', but this largely restates the schema's own description. Schema coverage is 100%, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource structure ('Get full details for one dataset on the OCC GIS hub') and clearly enumerates the return contents (distributions, spatial extent, license text). It distinguishes this from sibling tools by focusing on a single dataset found by title, contrasting with list_datasets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: when you need full details of one dataset found by exact or partial title match. It does not explicitly name alternatives or state when not to use it, but the context is unambiguous and implies a targeted lookup rather than listing or querying.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_layer_metadataGet ArcGIS layer metadataA
Fetch metadata (fields, geometry type, extent, name, description) for an ArcGIS FeatureServer/MapServer layer URL, such as one returned by list_datasets or get_dataset as 'featureServiceUrl'.
| Name | Required | Description | Default |
|---|---|---|---|
| layerUrl | Yes | ArcGIS REST layer URL, e.g. https://gis.occ.ok.gov/server/rest/services/Hosted/RBDMS_WELLS/FeatureServer/220 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must convey behavioral traits. The verb 'Fetch' implies a read-only operation, and the description lists the returned metadata fields, which is useful. However, it does not disclose error handling, authentication requirements, or any side effects (though likely none). It is adequate but lacks rich behavioral context that might be expected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the action and resource, then lists the metadata fields. It is concise with no fluff, and every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one parameter, no output schema), and the description covers its purpose, input source, and the fields it returns. It goes beyond the minimum by specifying the expected URL type and provenance. Minor gaps include not describing the response format, but the listed fields effectively convey what is returned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes the single parameter 'layerUrl' with a description and example, giving 100% schema coverage. The description adds a small hint about the URL's provenance (from list_datasets/get_dataset) and that it should be a layer endpoint, but this is marginal. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('Fetch') and resource ('ArcGIS FeatureServer/MapServer layer URL'), enumerating the exact metadata fields returned (fields, geometry type, extent, name, description). It also differentiates from siblings by referencing list_datasets/get_dataset and focusing on metadata, not querying.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context on when to use the tool: for a layer URL such as one returned by list_datasets or get_dataset as 'featureServiceUrl'. This implies it is the follow-up to those tools. It does not explicitly exclude alternatives like query_layer, but the context is clear enough for an agent to choose it for metadata retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_datasetsList OCC GIS datasetsA
List/search datasets published on the OCC GIS open data hub (gisdata-occokc.opendata.arcgis.com). Optionally filter with a free-text query matched against title, description, and keywords. Returns each dataset's title, description, landing page, keywords, and (when available) its ArcGIS FeatureServer/MapServer REST URL plus downloadable formats (CSV, GeoJSON, Shapefile, KML, File Geodatabase).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max number of results to return (default 25) | |
| query | No | Optional free-text search, e.g. 'wells', 'tanks', 'pipeline' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the data source URL, search matching behavior (title, description, keywords), and return fields, plus the caveat 'when available' for REST URL and formats, offering honest behavioral insight without promising more than the tool likely delivers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences and front-loads the core purpose. It is somewhat dense with comma-separated return field details, but every element serves a functional purpose and no filler exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema is present, so the description adequately enumerates return fields and optional filters. It could mention pagination or default limits, but the limit parameter in the schema already covers that, making this sufficiently complete for a list/search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema already has 100% coverage for the two parameters. The description adds meaning beyond the schema by specifying that the query is 'matched against title, description, and keywords', which enriches the schema's generic 'Optional free-text search'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List/search datasets published on the OCC GIS open data hub', using a specific verb and resource. It clearly distinguishes from siblings like get_dataset (single dataset) and query_layer (feature query) by focusing on dataset listing/searching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does and the optional query filter, but it does not explicitly state when to use this tool over siblings or when to avoid it. Usage is implied by the 'List/search' purpose, but no alternatives or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_layerQuery an ArcGIS layer's featuresA
Run an attribute and/or spatial query against an ArcGIS FeatureServer/MapServer layer (e.g. OCC well points, tank sites) and return matching feature attributes (and optionally geometry) as JSON. Use get_layer_metadata first to see available fields.
| Name | Required | Description | Default |
|---|---|---|---|
| where | No | SQL-style attribute filter, e.g. "COUNTY = 'OKLAHOMA'" or "STATUS = 'AC'". Defaults to 1=1 (all rows). | |
| geometry | No | Optional spatial filter geometry, e.g. 'xmin,ymin,xmax,ymax' envelope in WGS84 lon/lat. | |
| layerUrl | Yes | ArcGIS REST layer URL, e.g. https://gis.occ.ok.gov/server/rest/services/Hosted/RBDMS_WELLS/FeatureServer/220 | |
| outFields | No | Comma-separated field names to return, or '*' for all (default). | |
| spatialRel | No | Spatial relationship, e.g. esriSpatialRelIntersects (default). | |
| geometryType | No | Geometry type for the 'geometry' param, e.g. esriGeometryEnvelope (default) or esriGeometryPoint. | |
| orderByFields | No | Comma-separated field(s) to sort by, e.g. 'API_NUMBER ASC'. | |
| returnGeometry | No | Whether to include geometry (lat/lon) in results (default false). | |
| resultRecordCount | No | Max number of records to return (default 50). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the return format (JSON), optional geometry inclusion, and the nature of querying (read-only is implied). It could mention error handling or response size limits, but the 'Use get_layer_metadata first' hint and example layer URLs add useful context beyond minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the action, and every word contributes. It avoids redundancy while including examples and a usage hint, making it both concise and structured for quick scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 9 parameters and no output schema, the description covers the essential context: purpose, return type, and a prerequisite action. It does not mention output structure or error handling, but given the interactive schema and sibling context, it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds a helpful pointer to get_layer_metadata for field discovery, but does not elaborate on parameter relationships or edge cases. This meets the baseline for high schema coverage without adding substantial extra meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs an attribute and/or spatial query against an ArcGIS FeatureServer/MapServer layer and returns matching features as JSON. It uses a specific verb 'Run' and identifies the resource (layer), examples (OCC well points, tank sites), and distinguishes from siblings by explicitly mentioning get_layer_metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit context for when to use this tool (attribute/spatial query) and instructs to use get_layer_metadata first to see available fields, which implies a prerequisite step. It does not explicitly mention when not to use it or compare with list_datasets/get_dataset, but the guidance is clear enough for typical use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v1.0.0- First observed
get_dataset - First observed
get_layer_metadata - First observed
list_datasets - First observed
query_layer
TDQS
Scored across 4 tools
Each tool has a clearly distinct role: listing/searching datasets, fetching full dataset details, inspecting layer metadata, and querying layer features. There is no overlap that would confuse an agent selecting among them.
All tool names follow a consistent verb_noun pattern (list_datasets, get_dataset, get_layer_metadata, query_layer), using snake_case throughout and verbs that clearly indicate the action.
Four tools is an appropriate scope for a read-only GIS data discovery and query server. Each tool fills a necessary step in the workflow without redundancy or bloat.
The tool surface fully covers the core workflow: discovering datasets, retrieving full metadata, inspecting layer schemas, and querying features. No obvious dead ends exist; even direct data downloads are covered via distribution URLs returned by the get_dataset tool.
Maintenance
Related MCP Connectors
MCP server for querying Tulsa County, Oklahoma property and parcel data for AI agents.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
Agent-native MCP server over 49M+ US public and government records, privacy-first, always current.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for interacting with Google Earth Engine, enabling geospatial analysis such as dataset visualization, statistics computation, and search via AI assistants.15MIT
- AlicenseNot gradedqualityBmaintenanceThis MCP server provides access to City of Houston GIS open geospatial data, enabling search, query, and schema retrieval of datasets like parcels and zoning through ArcGIS feature services.21 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables searching and querying City of Tulsa GIS open geospatial datasets (parcels, zoning, public works) via ArcGIS Feature Services through natural language or direct MCP tool calls.19 npmMIT
- AlicenseAqualityDmaintenanceAn MCP server that gives LLM agents typed, cached access to civic open-data portals via Socrata (SODA 2.1 + Discovery API), enabling search, query, profiling, sampling, and CSV export of datasets.6MIT