fix sse server

Signed-off-by: ale <ale@manalejandro.com>
Este commit está contenido en:
ale
2025-12-01 05:20:44 +01:00
padre 0a786d902e
commit ac67b3dc7c
Se han modificado 3 ficheros con 324 adiciones y 14 borrados

Ver fichero

@@ -2,6 +2,22 @@
Servidor MCP (Model Context Protocol) para consultar la API del Instituto Nacional de Estadística (INE) de España. Implementa soporte completo para JSON-RPC sobre HTTP y SSE (Server-Sent Events), optimizado para su uso con VS Code AI Toolkit.
## ⚠️ Importante: Datos Disponibles
**Este servidor solo proporciona acceso a las estadísticas del INE.** El INE NO incluye datos de criminalidad.
**Tipos de datos disponibles:**
- 📊 Demografía y población
- 💰 Economía (IPC, PIB, mercado laboral)
- 🏢 Empresas y comercio
- 🏘️ Vivienda y construcción
- 📚 Educación y sociedad
- 🌾 Agricultura y medio ambiente
Para estadísticas de criminalidad en España, consulta el [Portal Estadístico de Criminalidad del Ministerio del Interior](https://estadisticasdecriminalidad.ses.mir.es/).
Ver la [guía completa de datos disponibles](./DATOS_DISPONIBLES.md) para más información.
## 🌟 Características
-**Protocolo MCP completo**: Soporte para JSON-RPC y SSE

Ver fichero

@@ -895,7 +895,7 @@ app.post('/mcp/v1', async (req: Request, res: Response) => {
console.log(`MCP tools/call: ${name}`, args);
if (!name) {
return res.status(400).json({
return res.status(200).json({
jsonrpc: '2.0',
error: {
code: -32602,

Ver fichero

@@ -84,46 +84,340 @@ async function handleToolCall(name: string, args: any): Promise<any> {
const tools = [
{
name: 'ine_datos_tabla',
description: 'Obtiene datos de una tabla específica del INE',
description: 'Obtiene datos de una tabla específica del INE. Permite filtrar por periodos, nivel de detalle y variables.',
inputSchema: {
type: 'object',
properties: {
idTabla: { type: 'string', description: 'ID de la tabla' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
nult: { type: 'number' },
det: { type: 'number', enum: [0, 1, 2] },
tip: { type: 'string', enum: ['A', 'M', 'AM'] }
idTabla: { type: 'string', description: 'ID de la tabla (ej: 50902)' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES', description: 'Idioma' },
nult: { type: 'number', description: 'Número de últimos periodos' },
det: { type: 'number', enum: [0, 1, 2], description: 'Nivel de detalle' },
tip: { type: 'string', enum: ['A', 'M', 'AM'], description: 'Tipo: A=amigable, M=metadatos, AM=ambos' },
tv: { type: 'string', description: 'Filtro de variables (formato: id_variable:id_valor)' },
date: { type: 'string', description: 'Rango de fechas (formato: aaaammdd:aaaammdd)' }
},
required: ['idTabla']
}
},
{
name: 'ine_datos_serie',
description: 'Obtiene datos de una serie temporal',
description: 'Obtiene datos de una serie temporal específica del INE.',
inputSchema: {
type: 'object',
properties: {
idSerie: { type: 'string', description: 'Código de la serie (ej: IPC251856)' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
nult: { type: 'number', description: 'Número de últimos periodos' },
det: { type: 'number', enum: [0, 1, 2], description: 'Nivel de detalle' },
tip: { type: 'string', enum: ['A', 'M', 'AM'], description: 'Tipo de respuesta' },
date: { type: 'string', description: 'Rango de fechas' }
},
required: ['idSerie']
}
},
{
name: 'ine_datos_metadata_operacion',
description: 'Obtiene datos de series usando filtros de metadata de una operación.',
inputSchema: {
type: 'object',
properties: {
idOperacion: { type: 'string', description: 'Código de operación (ej: IPC)' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
p: { type: 'number', description: 'Periodicidad (1=mensual, 3=trimestral, 12=anual)' },
nult: { type: 'number', description: 'Número de últimos periodos' },
det: { type: 'number', enum: [0, 1, 2] },
tip: { type: 'string', enum: ['A', 'M', 'AM'] },
g1: { type: 'string', description: 'Filtro 1 (formato: id_variable:id_valor)' },
g2: { type: 'string', description: 'Filtro 2' },
g3: { type: 'string', description: 'Filtro 3' },
g4: { type: 'string', description: 'Filtro 4' },
g5: { type: 'string', description: 'Filtro 5' }
},
required: ['idOperacion']
}
},
{
name: 'ine_operaciones_disponibles',
description: 'Lista todas las operaciones estadísticas disponibles en el INE.',
inputSchema: {
type: 'object',
properties: {
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
det: { type: 'number', enum: [0, 1, 2] },
geo: { type: 'number', enum: [0, 1], description: '0=nacional, 1=geográfico' },
page: { type: 'number', description: 'Página (500 elementos por página)' }
}
}
},
{
name: 'ine_operacion',
description: 'Obtiene información detallada de una operación estadística.',
inputSchema: {
type: 'object',
properties: {
idOperacion: { type: 'string', description: 'Código de operación' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
det: { type: 'number', enum: [0, 1, 2] }
},
required: ['idOperacion']
}
},
{
name: 'ine_variables',
description: 'Lista todas las variables estadísticas disponibles.',
inputSchema: {
type: 'object',
properties: {
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
page: { type: 'number' }
}
}
},
{
name: 'ine_variables_operacion',
description: 'Obtiene las variables utilizadas en una operación específica.',
inputSchema: {
type: 'object',
properties: {
idOperacion: { type: 'string' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
page: { type: 'number' }
},
required: ['idOperacion']
}
},
{
name: 'ine_valores_variable',
description: 'Obtiene todos los valores posibles de una variable.',
inputSchema: {
type: 'object',
properties: {
idVariable: { type: 'string', description: 'ID de la variable' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
det: { type: 'number', enum: [0, 1, 2] },
clasif: { type: 'number', description: 'ID de clasificación' }
},
required: ['idVariable']
}
},
{
name: 'ine_valores_variable_operacion',
description: 'Obtiene valores de una variable en el contexto de una operación.',
inputSchema: {
type: 'object',
properties: {
idVariable: { type: 'string' },
idOperacion: { type: 'string' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
det: { type: 'number', enum: [0, 1, 2] }
},
required: ['idVariable', 'idOperacion']
}
},
{
name: 'ine_tablas_operacion',
description: 'Lista todas las tablas de una operación estadística.',
inputSchema: {
type: 'object',
properties: {
idOperacion: { type: 'string' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
det: { type: 'number', enum: [0, 1, 2] },
geo: { type: 'number', enum: [0, 1] },
tip: { type: 'string', enum: ['A'] }
},
required: ['idOperacion']
}
},
{
name: 'ine_grupos_tabla',
description: 'Obtiene los grupos de selección que definen una tabla.',
inputSchema: {
type: 'object',
properties: {
idTabla: { type: 'string' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' }
},
required: ['idTabla']
}
},
{
name: 'ine_valores_grupos_tabla',
description: 'Obtiene los valores de un grupo específico de una tabla.',
inputSchema: {
type: 'object',
properties: {
idTabla: { type: 'string' },
idGrupo: { type: 'string' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
det: { type: 'number', enum: [0, 1, 2] }
},
required: ['idTabla', 'idGrupo']
}
},
{
name: 'ine_serie',
description: 'Obtiene información completa de una serie temporal.',
inputSchema: {
type: 'object',
properties: {
idSerie: { type: 'string' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
det: { type: 'number', enum: [0, 1, 2] },
tip: { type: 'string', enum: ['A', 'M', 'AM'] }
},
required: ['idSerie']
}
},
{
name: 'ine_series_operacion',
description: 'Lista todas las series de una operación.',
inputSchema: {
type: 'object',
properties: {
idOperacion: { type: 'string' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
det: { type: 'number', enum: [0, 1, 2] },
tip: { type: 'string', enum: ['A', 'M', 'AM'] },
page: { type: 'number' }
},
required: ['idOperacion']
}
},
{
name: 'ine_valores_serie',
description: 'Obtiene las variables y valores que definen una serie.',
inputSchema: {
type: 'object',
properties: {
idSerie: { type: 'string' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
nult: { type: 'number' },
det: { type: 'number', enum: [0, 1, 2] }
},
required: ['idSerie']
}
},
{
name: 'ine_operaciones_disponibles',
description: 'Lista todas las operaciones estadísticas',
name: 'ine_series_tabla',
description: 'Obtiene todas las series de una tabla específica.',
inputSchema: {
type: 'object',
properties: {
idTabla: { type: 'string' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
det: { type: 'number', enum: [0, 1, 2] },
tip: { type: 'string', enum: ['A', 'M', 'AM'] },
tv: { type: 'string', description: 'Filtro de variables' }
},
required: ['idTabla']
}
},
{
name: 'ine_serie_metadata_operacion',
description: 'Busca series usando filtros de metadata en una operación.',
inputSchema: {
type: 'object',
properties: {
idOperacion: { type: 'string' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
p: { type: 'number', description: 'Periodicidad' },
det: { type: 'number', enum: [0, 1, 2] },
tip: { type: 'string', enum: ['A', 'M', 'AM'] },
g1: { type: 'string' },
g2: { type: 'string' },
g3: { type: 'string' },
g4: { type: 'string' },
g5: { type: 'string' }
},
required: ['idOperacion']
}
},
{
name: 'ine_periodicidades',
description: 'Lista todas las periodicidades disponibles (mensual, trimestral, etc.).',
inputSchema: {
type: 'object',
properties: {
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' }
}
}
},
{
name: 'ine_publicaciones',
description: 'Lista todas las publicaciones estadísticas disponibles.',
inputSchema: {
type: 'object',
properties: {
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
geo: { type: 'number', enum: [0, 1] },
page: { type: 'number' }
det: { type: 'number', enum: [0, 1, 2] },
tip: { type: 'string', enum: ['A'] }
}
}
},
{
name: 'ine_publicaciones_operacion',
description: 'Obtiene las publicaciones de una operación específica.',
inputSchema: {
type: 'object',
properties: {
idOperacion: { type: 'string' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
det: { type: 'number', enum: [0, 1, 2] },
tip: { type: 'string', enum: ['A'] }
},
required: ['idOperacion']
}
},
{
name: 'ine_publicacion_fecha_publicacion',
description: 'Obtiene las fechas de publicación para una publicación dada.',
inputSchema: {
type: 'object',
properties: {
idPublicacion: { type: 'string' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
det: { type: 'number', enum: [0, 1, 2] },
tip: { type: 'string', enum: ['A'] }
},
required: ['idPublicacion']
}
},
{
name: 'ine_clasificaciones',
description: 'Lista todas las clasificaciones estadísticas disponibles.',
inputSchema: {
type: 'object',
properties: {
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' }
}
}
},
{
name: 'ine_clasificaciones_operacion',
description: 'Obtiene las clasificaciones utilizadas en una operación.',
inputSchema: {
type: 'object',
properties: {
idOperacion: { type: 'string' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' }
},
required: ['idOperacion']
}
},
{
name: 'ine_valores_hijos',
description: 'Obtiene valores hijos en una estructura jerárquica (ej: provincias de una comunidad).',
inputSchema: {
type: 'object',
properties: {
idVariable: { type: 'string', description: 'ID de la variable' },
idValor: { type: 'string', description: 'ID del valor padre' },
idioma: { type: 'string', enum: ['ES', 'EN'], default: 'ES' },
det: { type: 'number', enum: [0, 1, 2] }
},
required: ['idVariable', 'idValor']
}
}
// Agregar el resto de herramientas según sea necesario
];
/**