← SCRAM AI Lab

Herramientas IA

INEGI BIE/DENUE para context grounding

Inyectar datos reales de INEGI (16M series económicas, 5M empresas geolocalizadas) como context grounding mejora respuestas de LLM sobre mercado mexicano. MCP tool definition y patrón de detection.

May 21, 2026

5 lecturas

El LLM no sabe cuántas empresas hay en Querétaro. INEGI sí.

Claude Opus 4.7 te puede recitar la teoría de juegos de Nash pero no sabe cuántas empresas de manufactura hay en el Parque Industrial Bernardo Quintana. Esa pregunta — que un consultor de PyME mexicana hace todos los días — solo la responde INEGI: 16 millones de series económicas en BIE y 5 millones de empresas geolocalizadas en DENUE. Exponerlos como MCP es lo que convierte un chatbot genérico en un asesor competitivo para el mercado mexicano.

BIE vs DENUE: dos APIs, dos casos de uso

  • BIE (Banco de Información Económica): series temporales — IPC, IGAE, ENOE, exportaciones por estado. Útil para queries de "cómo va el sector X" o "cuánto creció Y"
  • DENUE (Directorio Estadístico Nacional): empresas geolocalizadas con SCIAN, tamaño, teléfono. Útil para queries de "cuántas/dónde están" y prospecting territorial

El patrón de grounding

No mandamos toda la query del usuario al LLM y esperamos que pida los datos. Hacemos detection primero: un regex y un clasificador ligero (gpt-4o-mini, tier 1) deciden si la pregunta tiene intent geográfico (estado, municipio, región) y/o sectorial (SCIAN, industria). Si sí, llamamos al MCP de INEGI y inyectamos el resultado en el system prompt antes de la respuesta final.

// detection layer (corre antes del LLM principal)
const intent = await classifyIntent(userMessage, {
  geographic: ['estado', 'municipio', 'región', 'cdmx', 'querétaro'],
  sectorial: ['manufactura', 'comercio', 'servicios', 'scian'],
});

if (intent.geographic && intent.sectorial) {
  const denueData = await mcp.call('denue_search', {
    entidad: intent.estado,
    municipio: intent.municipio,
    scian: intent.scian,
    estratos: ['51_100', '101_250', '251_mas'], // medianas y grandes
  });

  systemPrompt += `\n\nDATOS INEGI/DENUE (ground truth):\n${
    JSON.stringify(denueData.summary, null, 2)
  }\nUsa estos datos en tu respuesta. No inventes números.`;
}

Ejemplo real: Querétaro manufactura

Query del usuario: "¿cuántas empresas medianas/grandes de manufactura hay en Querétaro?". Sin grounding, Claude alucina un número plausible ("aproximadamente 3,500"). Con grounding vía DENUE MCP, retorna 4,287 empresas filtradas por estratos 51-100 / 101-250 / 251+ empleados, código SCIAN 31-33 (industrias manufactureras), entidad 22 (Querétaro). El LLM ahora puede desglosar por municipio y por subsector.

MCP tool definition para DENUE

{
  name: 'denue_search',
  description: 'Busca empresas en DENUE por entidad, municipio, SCIAN y estrato',
  inputSchema: {
    type: 'object',
    properties: {
      entidad: { type: 'string', description: 'Código INEGI de estado (01-32)' },
      municipio: { type: 'string', description: 'Código de municipio (opcional)' },
      scian: { type: 'string', description: 'Código SCIAN 2-6 dígitos' },
      estratos: {
        type: 'array',
        items: { enum: ['0_5', '6_10', '11_30', '31_50', '51_100', '101_250', '251_mas'] },
      },
      limit: { type: 'number', default: 100, maximum: 5000 },
    },
    required: ['entidad'],
  },
}

Caching agresivo

DENUE no cambia minuto a minuto; tiene release trimestral. Cacheamos respuestas en Postgres con TTL 30 días usando la query normalizada como key. Una búsqueda como "manufactura en Querétaro" se sirve en 12ms tras el primer hit; sin cache, INEGI tarda 800-1500ms. BIE es similar — series mensuales/trimestrales, TTL 7 días razonable.

Lo que falla en INEGI MCP

El endpoint BISE de INEGI tira HTML cuando el formato debería ser JSON si pasas un indicador desconocido. Nuestra fix (commit a7e381b del inegi-mcp) detecta el content-type antes de parsear y retorna error estructurado. Si construyes tu propio MCP wrapper: siempre valida content-type de respuestas INEGI antes de JSON.parse.

El siguiente reto: cuando el usuario pregunta sobre tendencias (no solo conteos), el grounding con BIE necesita series de 5+ años y eso explota tokens. Spoiler: pre-agregamos a quarterly y dejamos que el LLM pida zoom.

mcp
inegi
grounding
← Volver a SCRAM AI Lab