mx-postal-codes
API de Códigos Postales de México 🇲🇽
API RESTful ultra-rápida construida con Python 3.12, FastAPI, SQLite en modo WAL y Docker, diseñada para responder en < 1 ms con el catálogo oficial de Códigos Postales, Asentamientos, Municipios y Estados de México.
📜 Cláusula de Atribución Legal (Obligatoria por CC BY 4.0)
Esta API utiliza y procesa información geográfica y de códigos postales proveniente del catálogo oficial publicado por el Servicio Postal Mexicano (SEPOMEX) a través de datos.gob.mx bajo la licencia Creative Commons Attribution 4.0 International.
🚀 Características Principales
Contrato de API y Especificación: docs/api_contract.md
Velocidad y Desempeño: Tiempos de respuesta sub-milisegundo con SQLite en modo Write-Ahead Logging (WAL) y serialización
orjson.Ciberseguridad: Hardening OWASP, headers de seguridad, Rate Limiting, validación estricta de regex Pydantic v2 y Docker non-root user.
Manejo de Errores Enterprise: Formato RFC 7807 (Problem Details) con
X-Correlation-IDúnico por petición.Auditoría & Logging: Logs en JSON estructurado mediante
logurucon rotación diaria a medianoche (00:00), compresión.zipy retención de 30 días.Prevención de Deadlocks: Conexiones HTTP en modo solo lectura (
mode=ro) conPRAGMA busy_timeout=5000;.Script de Ingesta Automático: Descarga, limpia (ISO-8859-1 a UTF-8) y puebla la base de datos de manera atómica.
📦 Instalación y Ejecución Local
1. Requisitos Previos
Python 3.10+
Virtualenv o Docker
2. Configurar entorno e instalar dependencias
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt3. Ejecutar Ingesta de Datos (SEPOMEX / datos.gob.mx)
python scripts/ingest_sepomex.pyEste comando descargará el archivo CPdescarga.txt oficial y generará sepomex.db con más de 148,000 asentamientos e índices optimizados.
4. Iniciar Servidor de Desarrollo
uvicorn app.main:app --reload --port 8000Visita la documentación interactiva en: http://localhost:8000/docs
🐳 Ejecución con Docker
Opción A: Docker Build & Run
docker build -t codigos-postales-api .
docker run -p 8000:8000 codigos-postales-apiOpción B: Docker Compose
docker-compose up -d🔐 Autenticación & Rate Limiting (API Key & JWT)
La API cuenta con un esquema de autenticación híbrido configurable desde .env:
1. Modos de Operación (REQUIRE_AUTH)
REQUIRE_AUTH=False(Modo API Pública, por defecto): Los endpoints son de acceso libre. El control de peticiones se realiza mediante Rate Limiting por IP (120 req/min por defecto).REQUIRE_AUTH=True(Modo API Protegida Empresarial): Requiere que cada petición envíe credenciales válidas en los headers.
2. Opciones de Autenticación Soportadas
Header
X-API-Key:curl -H "X-API-Key: key-dev-12345" http://localhost:8000/api/v1/codigo-postal/01000Token JWT Bearer (
Authorization: Bearer <token>):Canje de token JWT (válido por 24 horas):
curl -X POST http://localhost:8000/api/v1/auth/token -H "X-API-Key: key-dev-12345"Petición con el Token devuelto:
curl -H "Authorization: Bearer <tu_jwt_token>" http://localhost:8000/api/v1/codigo-postal/01000
🛠️ Endpoints Disponibles
Método | Endpoint | Descripción |
|
| Dashboard Web interactivo de observabilidad, estadísticas y mapa GeoJSON |
|
| Consulta detalle de un CP (incluye |
|
| Validación y normalización masiva en lote de hasta 100 direcciones en una sola petición HTTP |
|
| Exportación de coordenadas y colonias en formato estándar GeoJSON ( |
|
| Autocompletado en tiempo real por prefijo de 2 a 5 dígitos |
|
| Búsqueda por proximidad geográfica (Haversine + Bounding Box) |
|
| Búsqueda FTS5 sin acentos, filtros combinados, paginación y exportación directa ( |
|
| Búsqueda rápida de asentamientos insensible a acentos |
|
| Lista de las 32 entidades federativas (con |
|
| Municipios por clave de estado |
|
| Detalle completo de municipio con todos sus CPs y colonias |
|
| Exportación de capas geográficas completas del estado en formato GeoJSON ( |
|
| Generación y descarga de reporte PDF ejecutivo (parámetros opcionales |
|
| Widget JavaScript para autocompletado automático de formularios HTML en cliente |
|
| Estadísticas métricas y desglose del catálogo SEPOMEX |
|
| Registros de auditoría en vivo y eventos del servidor en formato JSON |
|
| Cláusula de Atribución Legal CC BY 4.0 |
|
| Métricas de monitoreo en estándar Prometheus |
|
| Healthcheck para monitoreo Docker/K8s |
📦 Clientes SDK Oficiales (mx-postal-client)
El proyecto incluye dos paquetes clientes SDK livianos para consumir la API fácilmente sin escribir peticiones HTTP manuales:
Python SDK (
sdk/python):pip install ./sdk/pythonfrom mx_postal_client import MXPostalClient client = MXPostalClient(base_url="http://localhost:8080") cp_data = client.get_codigo_postal("01000", colonia="San Ángel")TypeScript / Node.js SDK (
sdk/typescript):npm install ./sdk/typescriptimport { MXPostalClient } from 'mx-postal-client'; const client = new MXPostalClient({ baseUrl: 'http://localhost:8080' }); const detail = await client.getCodigoPostal('01000');
🤖 Integración con Agentes de IA (Model Context Protocol - MCP)
La API cuenta con un Servidor MCP oficial (scripts/mcp_server.py) que permite a Agentes de IA (Claude Desktop, ChatGPT, Antigravity IDE, LangChain, AutoGPT) consultar e interactuar con la base de datos geográfica oficial de México en lenguaje natural.
Herramientas Expuestas para IA:
consultar_codigo_postal(cp): Retorna la ficha geográfica completa y lista de colonias.validar_direccion_postal(codigo_postal, colonia, estado, municipio): Valida en tiempo real la coincidencia de datos con SEPOMEX.buscar_asentamientos_por_nombre(nombre_colonia, limite): Búsqueda en lenguaje natural por palabras clave.
Configuración en Claude Desktop / Antigravity IDE (mcp.json):
{
"mcpServers": {
"mx-postal-codes": {
"command": "python3",
"args": ["/ruta/absoluta/a/codigos-postales-api/scripts/mcp_server.py"]
}
}
}🔄 Verificación Automática del Catálogo SEPOMEX
El contenedor ejecuta en segundo plano un planificador mensual asíncrono que comprueba la existencia de novedades en datos.gob.mx sin afectar la latencia HTTP (< 1 ms).
Para ejecutar manualmente la verificación o forzar la actualización del catálogo dentro del contenedor Docker:
docker exec codigos_postales_api python3 scripts/check_updates.py --force🏆 Comparativa con el Estado del Arte (2026)
Comparativa técnica de nuestra solución en relación a las alternativas open-source y servicios comerciales SaaS del mercado actual:
Dimensión Técnica / Funcionalidad | 🚀 Este Proyecto | 🟢 Tlaloc.sh | 🐍 Sepomex-MCP | ⚡ go-mexpost | 💳 Copomex |
Arquitectura | Self-Hosted (Docker/WAL) | SaaS Nube | Self-Hosted / Python | Self-Hosted / Go | SaaS Nube |
Latencia p99 | < 0.5 ms (Caché RAM L1) | ~120 ms | ~15 ms | ~2 ms | ~200 ms |
Estándar SAT CFDI 4.0 | ✅ Nativa ( | ✅ Nativa | ❌ No disponible | ❌ No disponible | ⚠️ Parcial |
Validación Masiva Lote ( | ✅ Hasta 100 req/petición | ❌ No disponible | ❌ No disponible | ❌ No disponible | ❌ No disponible |
Vectorial GeoJSON (CP y Estado) | ✅ Completo (Point & Bounds) | ❌ No disponible | ❌ No disponible | ❌ No disponible | ❌ No disponible |
Reporte Ejecutivo PDF | ✅ Nativo (ReportLab) | ❌ No disponible | ❌ No disponible | ❌ No disponible | ❌ No disponible |
Widget JavaScript Frontend | ✅ | ❌ No disponible | ❌ No disponible | ❌ No disponible | ⚠️ Custom JS |
Servidor MCP para Agentes IA | ✅ | ❌ No disponible | ✅ Incluido | ❌ No disponible | ❌ No disponible |
SDKs Oficiales (Python/TS) | ✅ | ❌ Peticiones HTTP | ❌ Peticiones HTTP | ❌ Peticiones HTTP | ❌ Peticiones HTTP |
Protección Payload Size (1 MB) | ✅ | ⚠️ Desconocido | ❌ No disponible | ⚠️ Nivel Proxy | ⚠️ Nivel Proxy |
Costo Operativo | $0 USD (Ilimitado) | Pay-per-lookup | $0 USD | $0 USD | $15-$150 USD/m |
🔬 Experimentos
El proyecto cuenta con una suite completa de pruebas de carga, geofencing GPS, normalización fiscal e interoperabilidad con Agentes de Inteligencia Artificial (MCP).
Fase 1 (Latencia y Lote): Aceleración de 58.91x en validación en lote (
POST /batch-validate).Fase 2 (Normalización SAT): $F_1$-Score algorítmico del 90.45% con 100% de precisión en dataset de 1,000 muestras con ruido.
Fase 3 (Agentes IA / MCP): 99.43% de ahorro en tokens al interoperar vía el Servidor MCP.
🧪 Ejecutar Pruebas
pytestLatest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/alonsomaciasm/codigos-postales-api'
If you have feedback or need assistance with the MCP directory API, please join our Discord server