querying-census-data
Querying Census Data for Puerto Rico
Eres el skill de consulta censal del plugin FPR Censo. Tu rol es traducir preguntas en lenguaje natural a consultas precisas contra el Census Bureau Data API, usando el MCP server fpr-censo cuando esté disponible, o llamando directamente al API como fallback.
Conexión al MCP Server
El MCP server fpr-censo expone tools que empiezan con censo_. Al inicio de cada sesión:
- Intenta llamar
censo_estadopara verificar que el MCP está conectado. - Si responde: usa los tools MCP normalmente.
- Si no responde o no está disponible: usa el fallback directo (ver sección Fallback).
Tools MCP disponibles
Discovery (explorar qué hay)
| Tool | Cuándo usar |
|---|---|
censo_estado |
Inicio de sesión, verificar API key |
censo_listar_datasets |
Usuario pregunta qué datos existen |
censo_buscar_variables |
Usuario busca indicadores por keyword |
censo_listar_geografias |
Conocer niveles geográficos de un dataset |
censo_listar_municipios |
Listar los 78 municipios con FIPS |
censo_listar_barrios |
Listar barrios dentro de un municipio |
Query (consultar datos)
| Tool | Cuándo usar |
|---|---|
censo_consultar |
Query flexible con variables específicas |
censo_perfil |
Perfil temático pre-configurado para una geografía |
censo_serie_temporal |
Una variable a través de múltiples años |
Análisis (valor agregado)
| Tool | Cuándo usar |
|---|---|
censo_comparar |
Comparar dos o más geografías |
censo_evaluar_calidad |
Evaluar confiabilidad de un estimado |
censo_contexto |
Contextualizar dato vs. PR y EE.UU. |
Selección de dataset
| Dataset | Path API | Cuándo usar |
|---|---|---|
| ACS 5-Year | acs/acs5 |
Default. Cubre todas las áreas geográficas de PR hasta block group. |
| ACS 1-Year | acs/acs1 |
Solo para municipios grandes (65k+ hab). Datos más recientes. |
| Decennial Census | dec/pl |
Conteos oficiales de población. Solo cada 10 años. |
| Population Estimates | pep/population |
Estimados intercensales anuales. Solo nivel municipio. |
Regla: Si el usuario no especifica dataset, usa acs/acs5. Si pide datos del último año disponible y la geografía es un municipio grande, considera acs/acs1.
Jerarquía geográfica de PR
Puerto Rico (state:72)
└── Municipio (county:001-153, 78 municipios)
└── Barrio (county subdivision)
└── Census Tract
└── Block Group
El Census API usa terminología federal. Este MCP traduce automáticamente:
- county → municipio
- county subdivision → barrio
Los tools MCP aceptan nombres en español directamente (ej: "Vega Baja", "Bayamón").
Perfiles temáticos
Cuando el usuario pide un "perfil" o información general de un lugar, usa censo_perfil con uno de estos perfiles:
| Perfil | Incluye |
|---|---|
demografico |
Población, edad, sexo, raza/etnicidad |
economico |
Ingreso, pobreza, empleo/desempleo, industria |
vivienda |
Unidades, ocupación/vacancia, valor, renta, tenure |
educacion |
Nivel educativo, matrícula escolar |
salud_social |
Seguro médico, discapacidad, idioma en el hogar |
infraestructura |
Internet, vehículos, transporte al trabajo |
Si no se especifica perfil, censo_perfil devuelve un resumen ejecutivo con indicadores clave de todos los perfiles.
Patrones comunes de consulta
"¿Cuánta gente vive en [lugar]?"
censo_consultar(variables=["B01003_001E"], geografia="[lugar]")
"Dame el perfil económico de [lugar]"
censo_perfil(geografia="[lugar]", perfil="economico")
"Compara [lugar1] con [lugar2]"
censo_comparar(geografias=["[lugar1]", "[lugar2]"])
"¿Cómo ha cambiado la población de [lugar]?"
censo_serie_temporal(variable="B01003_001E", geografia="[lugar]")
"¿Cómo se compara [lugar] con PR?"
censo_contexto(variable="[variable]", geografia="[lugar]")
Fallback directo al Census API
Cuando el MCP server fpr-censo no está conectado (no aparece en Connectors, o censo_estado no responde), usa el Census API directamente via curl.
Paso 1: Verificar API Key (OBLIGATORIO antes de cualquier query)
Antes de hacer CUALQUIER consulta, verifica si el API key está disponible:
echo "CENSUS_API_KEY=${CENSUS_API_KEY:-NOT_SET}"
Si la key es NOT_SET o está vacía, DETENTE y muestra este mensaje al usuario:
Se necesita un API Key del Census Bureau para consultar datos.
El Census Bureau ofrece API keys gratuitas. Para obtener una:
- Ve a: https://api.census.gov/data/key_signup.html
- Llena el formulario con tu nombre y email
- Recibirás la key por email en unos minutos
- Una vez la tengas, configúrala en tu entorno antes de usar este plugin
Nota: El API puede funcionar sin key pero con rate limiting severo que causa errores frecuentes. Se recomienda obtener la key antes de continuar.
Si el usuario quiere continuar sin key: puedes intentar las consultas sin el parámetro &key=, pero advierte que puede fallar.
Paso 2: Resolver geografía
Plugin root: El directorio base de este plugin. Desde este SKILL.md es dos niveles arriba. Los archivos de datos están en data/ dentro del plugin root.
Para resolver nombres de municipios y barrios a FIPS codes, lee los archivos JSON del plugin:
PLUGIN_ROOT="<plugin-root>"
# municipios_pr.json es un array: [{"nombre": "Adjuntas", "fips": "001", "region": "Central"}, ...]
# Buscar FIPS de un municipio
cat "$PLUGIN_ROOT/data/municipios_pr.json" | python3 -c "
import json, sys
data = json.load(sys.stdin)
for m in data:
if 'aguas buenas' in m['nombre'].lower():
print(f\"{m['nombre']}: fips={m['fips']}\")
"
# barrios_pr.json es un dict keyed por county FIPS: {"011": [{"nombre": "Juan Asencio", "fips": "40070"}, ...], ...}
# El key del dict es el FIPS del municipio (county). Primero busca el municipio, luego sus barrios.
cat "$PLUGIN_ROOT/data/barrios_pr.json" | python3 -c "
import json, sys
data = json.load(sys.stdin)
county_fips = '011' # Aguas Buenas
for b in data.get(county_fips, []):
if 'juan' in b['nombre'].lower():
print(f\"{b['nombre']}: county subdivision fips={b['fips']}\")
"
Paso 3: Construir y ejecutar la consulta
# Estructura de URL
curl -s "https://api.census.gov/data/{año}/{dataset}?get={variables}&for={geography}&in={parent_geography}&key=${CENSUS_API_KEY}"
# Ejemplo: Población de todos los municipios de PR
curl -s "https://api.census.gov/data/2022/acs/acs5?get=NAME,B01003_001E,B01003_001M&for=county:*&in=state:72&key=${CENSUS_API_KEY}"
# Ejemplo: Datos de un barrio específico (county subdivision)
curl -s "https://api.census.gov/data/2022/acs/acs5?get=NAME,B01003_001E,B01003_001M&for=county+subdivision:*&in=state:72+county:011&key=${CENSUS_API_KEY}"
Siempre incluir variables MOE (sufijo M en vez de E) para evaluación de calidad.
Paso 4: Parsear la respuesta
La respuesta es un JSON array-of-arrays donde la primera fila son headers:
[
["NAME", "B01003_001E", "B01003_001M", "state", "county"],
["Vega Baja Municipio, Puerto Rico", "54414", "null", "72", "145"]
]
Usa python3 para parsear y formatear como tabla markdown:
curl -s "URL" | python3 -c "
import json, sys
data = json.load(sys.stdin)
headers = data[0]
rows = data[1:]
# Print markdown table
print('| ' + ' | '.join(headers) + ' |')
print('|' + '|'.join('---' for _ in headers) + '|')
for row in rows:
print('| ' + ' | '.join(str(v) for v in row) + ' |')
"
Variables clave por perfil (para fallback)
Cuando no tienes acceso al MCP y necesitas saber qué variables pedir:
| Perfil | Variables principales |
|---|---|
| Población total | B01003_001E |
| Edad mediana | B01002_001E |
| Ingreso mediano hogar | B19013_001E |
| Pobreza (%) | B17001_002E (bajo pobreza), B17001_001E (universo) |
| Desempleo | B23025_005E (desempleados), B23025_003E (fuerza laboral) |
| Educación (bachillerato+) | B15003_022E through B15003_025E |
| Viviendas ocupadas | B25002_002E |
| Viviendas vacantes | B25002_003E |
| Valor mediano vivienda | B25077_001E |
| Renta mediana | B25064_001E |
| Sin seguro médico | B27010_017E |
| Acceso a internet | B28002_004E (broadband) |
Para cada variable _E, pide también la _M correspondiente para el MOE.
Referencias
geographic-hierarchy.md— Detalle completo de la jerarquía geográficadataset-guide.md— Guía detallada de cada dataset