sunat-datos-abiertos-mcp
Sunat-datos-abiertos-mcp is a Model Context Protocol server and CLI that lets you query SUNAT's open data (Peruvian tax agency) datasets (RUC registry, electronic invoices, etc.) by streaming through large files without downloading them, offering search, filtering, aggregation, profiling, and preview capabilities.
List SUNAT datasets and their resources.
Search for resources across the catalog by keywords.
Get details and the latest resource of a dataset.
Preview a resource's first rows with detected delimiters and encodings.
Profile a resource: infer column types, emptiness, distinct values, and examples.
Filter rows in a resource using equality, contains, regex, numeric comparisons, etc., without downloading the full file.
Count rows grouped by a column (with filters), with a limit on distinct values.
Download a resource to disk if needed.
Manage the local catalog cache (status, clear, path).
Operates in streaming fashion, memory-efficient, handling portal quirks (HTML errors, misleading formats, variable delimiters/encodings).
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@sunat-datos-abiertos-mcp lista los datasets de SUNAT disponibles"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
sunat-datos-abiertos-mcp
Servidor MCP (Model Context Protocol) + CLI para consultar los datasets de SUNAT publicados en la Plataforma Nacional de Datos Abiertos del Perú: padrón RUC con clasificación CIIU, padrón de emisores de comprobantes electrónicos, agentes de retención/percepción de IGV, etc.
La idea central: los archivos son enormes (el padrón RUC son ~230 MB comprimidos y ~3 GB de CSV con 12.5 millones de filas) y descargarlos para responder una pregunta no tiene sentido. Este servidor los lee en streaming y filtra, agrupa y perfila sobre la marcha, sin escribir nada en disco.
Requisitos
Node.js 18+ (probado en Node 24)
Related MCP server: datagovma-mcp
Instalación
npm install
npm run buildTools disponibles (MCP)
Catálogo
Tool | Descripción |
| Lista los datasets de SUNAT (slug, título, nº de recursos). Cacheado. |
| Busca archivos por palabras clave en todo el catálogo, sin tildes ni mayúsculas. La vía más rápida al |
| Detalle y lista completa de recursos de un dataset. Cacheado. |
| El recurso del periodo más reciente de un dataset (p. ej. el último padrón mensual). |
| Metadata y URL real de descarga de un recurso. |
Datos
Tool | Descripción |
| Columnas reales del archivo con tipo inferido, vacíos, valores distintos y ejemplos. Úsalo antes de filtrar. |
| Primeras filas ya parseadas como objetos, con delimitador y encoding detectados. |
| Filtra filas dentro del archivo en streaming, sin descargarlo. Filtros por columna ( |
|
|
| Descarga el archivo completo a disco (último recurso, rara vez necesario). |
| Estado o limpieza de la caché local del catálogo. |
Flujo típico: sunat_buscar_recursos → sunat_perfilar_recurso → sunat_buscar_en_recurso o
sunat_contar_por_columna.
Particularidades del portal (verificadas contra la API real)
Este portal es CKAN, pero con varias trampas. Todas están resueltas en el código:
package_searchyorganization_listdevuelven 404. Por eso se navega el grupo de SUNAT congroup_package_showy la búsqueda por palabras clave se hace en cliente.Ante un error el portal responde HTML, no JSON. Se valida el
content-typeantes de parsear, así el fallo dice qué pasó en vez de reventar con un error de sintaxis JSON.package_showygroup_package_showenvuelven el resultado en un array de un solo elemento, a diferencia depackage_list/resource_show. Se desenvuelve solo si hace falta.El WAF responde
418a ciertos User-Agent (curl/*, o cualquiera con una URL entre paréntesis). El User-Agent se mantiene como un token simple producto/versión a propósito.El campo
formatmiente: los padrones RUC se declarancsvpero se sirven como.zip. El tipo se decide por los bytes reales (firmaPK), no por la metadata; cada recurso reporta además unformato_real.El delimitador varía entre archivos:
PadronRUC_202209.csvusa|yPadronRUC_202412.csvusa,. Se detecta por archivo, junto con;y tabulador.El encoding varía: el padrón RUC es latin1 y el de agentes de retención es utf-8. Se detecta con los primeros bytes, así que
HUÁNUCOyENSEÑANZAno salen mojibake.
Uso con Claude Desktop / Claude Code
{
"mcpServers": {
"sunat-datos-abiertos": {
"command": "node",
"args": ["C:\\source\\mcp-sunat\\build\\index.js"]
}
}
}Uso como CLI
npm run build
npm link # instala el comando `sunat` globalmentesunat list # datasets de SUNAT
sunat search padron ruc 2024-12 # busca recursos por palabras clave
sunat show <dataset> # detalle y recursos de un dataset
sunat latest <dataset> # el recurso más reciente
sunat resource <resource_id> # metadata y URL de un recurso
sunat schema <resource_id> # columnas reales, tipos, ejemplos
sunat preview <resource_id> -n 50 # primeras filas parseadas
sunat find <resource_id> -w RUC=20100070970 # busca filas sin descargar el archivo
sunat count <resource_id> Departamento -w Estado=ACTIVO # group by en streaming
sunat download <resource_id> -o ./padron.zip # descarga completa
sunat cache status | clear | path # caché localFiltros de find/count (-w, repetible):
Forma | Significado |
| igualdad |
| contiene |
|
|
Las comparaciones ignoran tildes y mayúsculas (huanuco encuentra HUÁNUCO).
Flags globales: --json (salida cruda para pipes) y --no-color.
Ejemplo real
$ sunat find a6892afd-f622-4564-8acd-44644912fcb4 -w RUC=20100070970 \
-c RUC,Estado,Condicion,Tipo,Departamento
┌─────────────┬────────┬───────────┬──────────────────┬──────────────┐
│ RUC │ Estado │ Condicion │ Tipo │ Departamento │
├─────────────┼────────┼───────────┼──────────────────┼──────────────┤
│ 20100070970 │ ACTIVO │ HABIDO │ SOCIEDAD ANONIMA │ LIMA │
└─────────────┴────────┴───────────┴──────────────────┴──────────────┘
1 coincidencia(s) | 12,515,483 filas escaneadas | 3.1 GB leidos | escaneo completo: si12.5 millones de filas recorridas, cero bytes escritos en disco. El tiempo lo pone la red (~3 min con esa conexión), no el parseo.
Configuración por entorno
Variable | Efecto |
| Carpeta de la caché del catálogo (default |
| TTL de la caché en ms (default 6 h; |
| Tope de bytes descomprimidos por escaneo (default 6 GB). |
| Carpeta destino por defecto de |
Solo se cachea la metadata del catálogo (cambia poco). El contenido de los archivos nunca se cachea, y un resultado que no se pudo interpretar tampoco: así un error puntual del portal no envenena la caché.
Límites conocidos
Un campo entrecomillado que contenga saltos de línea no está soportado (los archivos de este portal no los usan; soportarlo obligaría a bufferear filas completas).
sunat_contar_por_columnarechaza columnas con más de 50 000 valores distintos: agrupar por RUC no tiene sentido, para eso estásunat_buscar_en_recurso.escaneo_completo: falsesignifica que el conteo es parcial (se cortó por límite de filas, bytes o coincidencias). Siempre revisa ese campo antes de afirmar un total.
Desarrollo
npm run build # compila TypeScript a build/
npm start # corre el servidor MCP compilado
node build/cli.js list # corre la CLI sin npm linkLicencia
MIT. Ver LICENSE.
Available Tools
4 toolssunat_listar_datasetsListar datasets de SUNATA
Lista los datasets (padrones de contribuyentes, comprobantes electronicos, etc.) publicados por SUNAT en la Plataforma Nacional de Datos Abiertos del Peru (datosabiertos.gob.pe). Usa el campo 'dataset' de cada resultado con 'sunat_obtener_dataset' para ver sus recursos.
Inputs: no named parameters.
sunat_obtener_datasetObtener detalle de un dataset de SUNATA
Devuelve la descripcion y la lista de recursos (archivos) de un dataset de SUNAT identificado por su slug (campo 'dataset' de 'sunat_listar_datasets'). Cada recurso trae un 'id' que se usa con 'sunat_obtener_recurso' o 'sunat_previsualizar_recurso' para acceder al archivo real.
Inputs: dataset (required).
sunat_obtener_recursoObtener metadata y URL de descarga real de un recursoA
Dado el 'id' de un recurso (de 'sunat_obtener_dataset'), devuelve su metadata completa incluyendo la URL directa de descarga del archivo. Nota: en este portal el campo 'formato' no siempre es confiable; muchos archivos declarados como csv en realidad son .zip que contienen el csv adentro.
Inputs: resource_id (required).
sunat_previsualizar_recursoPrevisualizar filas de un recurso de SUNATA
Descarga solo el inicio de un recurso de SUNAT (csv suelto o csv dentro de un zip) y devuelve el encabezado mas las primeras filas, sin bajar el archivo completo (algunos pesan cientos de MB). Usa el 'id' de un recurso obtenido de 'sunat_obtener_dataset'.
Inputs: resource_id (required), filas.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 4 tools
Each tool has a distinct purpose: listing datasets, getting dataset details, retrieving resource metadata, and previewing a resource. There is no overlap or ambiguity between them.
All tools follow the pattern `sunat_<verb_in_spanish>_<noun>`, using consistent snake_case and infinitive verbs (listar, obtener, previsualizar).
With 4 tools, the server is focused and not excessive. It covers the core workflow of discovering and accessing open data, though a few more tools (e.g., search) could enhance completeness.
The tool set covers the full pipeline from listing datasets to previewing resource content. A minor gap is the lack of a tool to directly download a resource, but the URL provided via `sunat_obtener_recurso` addresses that.
Related MCP Connectors
MCP server for Brazilian Federal Senate open data (legislative, administrative, e-Cidadania).
MCP server for French (BOAMP) + EU (TED) public procurement data via TenderAPI.
An MCP server for Georgian public data, read from the organizations that publish it.
This MCP server provides seamless access to Malaysia's government open data, including datasets, w…
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP server for Peruvian public-data lookups including SUNAT RUC registrations, BCRP exchange rates, and SEACE tenders. Provides official open-data access through tools for Claude, Cursor, and other MCP clients.MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for the Moroccan Open Data portal (data.gov.ma) enabling search and retrieval of datasets, resources, organizations, and groups via CKAN API.2MIT
- FlicenseNot gradedqualityDmaintenanceMCP server for Peruvian government data, enabling search and anomaly detection in public procurement (OSCE) and legislative tracking (Congress), plus semantic search over both domains.-
- AlicenseAqualityBmaintenanceLocal MCP server for validating and querying Peruvian RUCs using SUNAT's official reduced registry, stored locally to keep data private.4MIT