Skip to main content
Glama
suryast

indonesia-civic-stack

by suryast

🇮🇩 indonesia-civic-stack

PyPI MCP Registry CI Python License

Scrapers, normalizadores y wrappers de API listos para producción para fuentes de datos del gobierno de Indonesia.

La capa de infraestructura bajo halalkah.id y legalkah.id, y un bien público para la comunidad indonesia de tecnología cívica y desarrolladores.


Por qué

Los datos públicos de Indonesia son nominalmente abiertos, pero prácticamente inaccesibles. Cada desarrollador que crea herramientas cívicas vuelve a resolver los mismos problemas de scraping de forma independiente: registros de productos en BPOM, certificados halal en BPJPH, registros de empresas en AHU. Los scrapers se degradan en cuestión de meses a medida que los portales cambian. No existe una capa compartida y mantenida.

Este repositorio es esa capa. Un pip install para consultar los portales del gobierno de Indonesia: sin más scrapers hechos a medida.

Prioridad para agentes de IA

Este SDK está diseñado tanto para humanos como para agentes de IA:

  • 🤖 46 herramientas MCP — conéctalo a Claude, GPT o cualquier agente compatible con MCP

  • 📋 SKILL.md — descubrimiento de habilidades para agentes de IA (formato AgentSkills)

  • 🧑💻 AGENTS.md — guía de arquitectura para agentes de programación (Claude Code, Codex, Cursor)

  • 📝 CLAUDE.md — instrucciones específicas para Claude Code

  • Respuestas tipadas — envoltorio CivicStackResponse, nunca diccionarios en bruto

  • 🔁 Patrones coherentes — cada módulo sigue el mismo contrato


Related MCP server: openapi-mcp-sdk

Arquitectura

graph TB
    subgraph "Your App"
        A[halalkah.id] 
        B[legalkah.id]
        C[Your Project]
    end

    subgraph "civic-stack"
        SDK[Python SDK]
        MCP[MCP Servers]
        API[REST API]
        
        subgraph "Shared Layer"
            SC[shared/schema.py<br/>CivicStackResponse]
            HC[shared/http.py<br/>Rate limiting · Retries · Proxy]
        end

        subgraph "Phase 1"
            BPOM[bpom<br/>Food & Drug]
            BPJPH[bpjph<br/>Halal Certs]
            AHU[ahu<br/>Company Registry]
        end

        subgraph "Phase 2"
            OJK[ojk<br/>Financial Licenses]
            OSS[oss_nib<br/>Business ID]
            LPSE[lpse<br/>Procurement]
            KPU[kpu<br/>Elections]
        end

        subgraph "Phase 3"
            LHKPN[lhkpn<br/>Wealth Declarations]
            BPS[bps<br/>Statistics]
            BMKG[bmkg<br/>Weather & Disasters]
            SIMBG[simbg<br/>Building Permits]
        end
    end

    subgraph "Government Portals"
        P1[cekbpom.pom.go.id]
        P2[sertifikasi.halal.go.id]
        P3[ahu.go.id]
        P4[ojk.go.id]
        P5[oss.go.id]
        P6[lpse.*.go.id]
        P7[infopemilu.kpu.go.id]
        P8[elhkpn.kpk.go.id]
        P9[webapi.bps.go.id]
        P10[data.bmkg.go.id]
        P11[simbg.pu.go.id]
    end

    A & B & C --> SDK & MCP & API
    SDK & MCP & API --> SC
    SC --> BPOM & BPJPH & AHU & OJK & OSS & LPSE & KPU & LHKPN & BPS & BMKG & SIMBG
    BPOM & BPJPH & AHU & OJK & OSS & LPSE & KPU & LHKPN & BPS & BMKG & SIMBG --> HC
    BPOM --> P1
    BPJPH --> P2
    AHU --> P3
    OJK --> P4
    OSS --> P5
    LPSE --> P6
    KPU --> P7
    LHKPN --> P8
    BPS --> P9
    BMKG --> P10
    SIMBG --> P11

Flujo de solicitudes

sequenceDiagram
    participant App as Your App
    participant SDK as Civic SDK
    participant HTTP as shared/http.py
    participant Proxy as Proxy (optional)
    participant Portal as Gov Portal

    App->>SDK: search("paracetamol")
    SDK->>HTTP: civic_client(proxy_url)
    Note over HTTP: Auto-reads PROXY_URL<br/>from environment
    alt rewrite mode (CF Worker)
        HTTP->>Proxy: GET ?url=encoded_target
        Proxy->>Portal: Forwarded request
        Portal-->>Proxy: HTML/JSON response
        Proxy-->>HTTP: Response
    else connect mode (SOCKS/HTTP)
        HTTP->>Proxy: CONNECT tunnel
        Proxy->>Portal: Proxied request
        Portal-->>HTTP: Response
    else no proxy
        HTTP->>Portal: Direct request
        Portal-->>HTTP: Response
    end
    HTTP-->>SDK: httpx.Response
    SDK->>SDK: Parse + Normalize
    SDK-->>App: CivicStackResponse

Estado de los módulos

Módulo

Fuente

Datos

Proxy

Estado

bpom

cekbpom.pom.go.id

Registros de alimentos, medicamentos y cosméticos

🌐

✅ Activo

bpjph

cmsbl.halal.go.id

Certificados halal (1.98M+ registros)

🌐

✅ Activo — migrado a API REST (v1.0.0)

ahu

ahu.go.id

Registro de empresas — PT, CV, Yayasan, Koperasi

🇮🇩

⚠️ Página reestructurada — cambió el campo de búsqueda (abr 2026)

ojk

www.ojk.go.id/waspada-investasi

Instituciones financieras autorizadas + lista Waspada

🇮🇩

⚠️ Portal migrado a SharePoint (abr 2026) — el scraper necesita reescribirse

oss_nib

oss.go.id

Identidad empresarial (NIB)

🇮🇩

⚠️ Página reestructurada — Playwright no encuentra los campos de entrada (abr 2026)

lpse

spse.inaproc.id

Contratación pública

🇮🇩

✅ Activo — ya no está deprecado (v1.0.0)

kpu

infopemilu.kpu.go.id

Datos electorales — candidatos, resultados, financiación

🌐

✅ Activo

bps

webapi.bps.go.id

Conjuntos de datos estadísticos (1,000+)

🌐

✅ Activo (requiere BPS_API_KEY)

bmkg

data.bmkg.go.id

Datos meteorológicos, de terremotos y de desastres

🌐

✅ Activo

simbg

simbg.pu.go.id

Permisos de construcción (PBG) — multiportal

🌐

✅ Activo

jdih

peraturan.go.id

Base de datos jurídica nacional — UU, PP, Perpres, Permen

🇮🇩

Nuevo — scraping con Playwright

ksei

web.ksei.co.id

Estadísticas de valores (62 PDF mensuales) + valores registrados

🌐

Nuevo — scraping HTML (sin necesidad de proxy)

djpb

data-apbn.kemenkeu.go.id

Temas presupuestarios APBN — objetivo/realización/logro

🇮🇩

Nuevo — API JSON REST limpia

lhkpn

elhkpn.kpk.go.id

Declaraciones de patrimonio (funcionarios)

✅ Activo — reCAPTCHA v3 resuelto con Playwright

🌐 = funciona en todo el mundo 🇮🇩 = requiere proxy de Indonesia (define PROXY_URL)

Cada módulo devuelve el mismo envoltorio CivicStackResponse — intercambia fuentes de datos sin tocar la lógica de la aplicación.

Madurez de los módulos

Módulo

Scraper

Normalizador

MCP

Pruebas

Estado del portal

bpom

bpjph

✅ API REST

ahu

⚠️ página reestructurada

ojk

⚠️ migración a SharePoint

oss_nib

⚠️ página reestructurada

lpse

🇮🇩 bloqueo geográfico

kpu

bps

bmkg

simbg

jdih

🇮🇩 Playwright

ksei

✅ (sin necesidad de proxy)

djpb

✅ API JSON REST

lhkpn

✅ Activo (Playwright)


Inicio rápido

Instalación

pip install indonesia-civic-stack          # Core SDK
pip install "indonesia-civic-stack[mcp]"   # + MCP server (40 tools)
pip install "indonesia-civic-stack[api]"   # + REST API (FastAPI + uvicorn)
pip install "indonesia-civic-stack[all]"   # Everything

SDK de Python

import asyncio
from civic_stack.bpom.scraper import search as bpom_search
from civic_stack.bmkg.scraper import get_latest_earthquake

async def main():
    # Search BPOM product registry
    results = await bpom_search("paracetamol")
    for r in results:
        if r.found:
            print(r.result)

    # Get latest earthquake
    eq = await get_latest_earthquake()
    print(eq.result)  # {'date': '...', 'magnitude': '5.2', ...}

asyncio.run(main())

Servidor MCP (para agentes de IA)

Los 14 módulos exponen 46 herramientas MCP para usarlas con Claude, GPT o cualquier agente compatible con MCP.

# Install locally:
pip install "indonesia-civic-stack[mcp]"
claude mcp add civic-stack -- civic-stack-mcp

# Or deploy your own remote server (Railway one-click):
# See "Self-Hosted MCP Server" section below

Las clases de servidor MCP admiten dos estilos de inicialización:

# Style 1: Explicit init
class BpomMCPServer(CivicStackMCPBase):
    def __init__(self):
        super().__init__("bpom")

# Style 2: Class attribute
class BmkgMCPServer(CivicStackMCPBase):
    module_name = "bmkg"

API REST

# Run all modules
uvicorn app:app --port 8000

# With API key auth (recommended)
CIVIC_API_KEY=your-secret-key uvicorn app:app --port 8000

# Individual module
uvicorn modules.bpom.app:app --port 8001

# With proxy
PROXY_URL=socks5://id-proxy:1080 uvicorn app:app --port 8000
# Endpoints
GET /bpom/check/MD123456789012
GET /bpom/search?q=paracetamol
GET /bpjph/check/BPJPH-12345
GET /ahu/search?q=PT+Contoh+Indonesia
GET /ojk/check?name=Bank+BCA
GET /kpu/candidate/search?q=Joko
GET /lhkpn/search?q=Anies          # ✅ reCAPTCHA v3 solved via Playwright
GET /bps/search?q=inflasi           # Requires BPS_API_KEY
GET /bmkg/weather?city=jakarta
GET /simbg/search?q=Jakarta+Selatan

Envoltorio de respuesta

Cada módulo devuelve CivicStackResponse:

{
  "result": {"product_name": "...", "registration_status": "ACTIVE"},
  "found": true,
  "status": "ACTIVE",
  "confidence": 1.0,
  "source_url": "https://cekbpom.pom.go.id/...",
  "fetched_at": "2026-03-14T06:30:00Z",
  "module": "bpom"
}

Valores de estado: ACTIVE, EXPIRED, SUSPENDED, REVOKED, NOT_FOUND, ERROR.

Cuando un módulo no puede acceder a su portal o le falta configuración (p. ej., BPS_API_KEY), devuelve un envoltorio de error en lugar de fallar:

{
  "result": null,
  "found": false,
  "status": "ERROR",
  "confidence": 0.0,
  "source_url": "https://webapi.bps.go.id",
  "module": "bps",
  "detail": "BPS_API_KEY not set. Register at https://webapi.bps.go.id/developer/register"
}

Detalles internos de los módulos

civic_stack/bpom/
├── __init__.py
├── app.py          # FastAPI application
├── normalizer.py   # Raw HTML/JSON → structured dict
├── router.py       # FastAPI routes
├── scraper.py      # fetch() + search() — core logic
├── server.py       # FastMCP MCP server
├── Dockerfile
└── README.md

La capa shared/ proporciona:

  • schema.py — modelo Pydantic CivicStackResponse, enumeración de estado, constructores auxiliares

  • http.py — fábrica civic_client() con proxy automático, limitador de frecuencia, reintento con retroceso exponencial y reescritura de URLs para proxies de CF Worker

  • mcp.py — clase base abstracta CivicStackMCPBase para servidores MCP


Notas de despliegue

Bloqueo geográfico y requisitos de proxy

La mayoría de los portales gubernamentales de Indonesia (*.go.id) restringen el acceso a direcciones IP indonesias. Si despliegas fuera de Indonesia, debes definir PROXY_URL para enrutar las solicitudes a través de un endpoint indonesio.

# Option 1: Indonesian VPS/SOCKS proxy (recommended for production)
export PROXY_URL="socks5://id-proxy.example.com:1080"
export PROXY_MODE="connect"

# Option 2: CF Worker proxy (free, but limited — see below)
export PROXY_URL="https://your-proxy.workers.dev"
# PROXY_MODE auto-detects "rewrite" for *.workers.dev

Sin un proxy, espera: errores de resolución DNS, timeouts de conexión o respuestas HTTP 403/404 de la mayoría de los módulos.

El SDK lee automáticamente PROXY_URL del entorno — no se necesitan cambios de código en los scrapers ni en los servidores MCP.

Modos de proxy

Modo

Ejemplo de PROXY_URL

Cómo funciona

connect

socks5://id-proxy:1080

Proxy estándar HTTP/SOCKS CONNECT mediante transporte httpx

rewrite

https://x.workers.dev

Reescribe las URLs a ?url=<target> (se detecta automáticamente para *.workers.dev)

none

(sin definir)

Conexión directa

Anula la detección automática con PROXY_MODE=connect|rewrite.

Proxy de CF Worker

Se incluye un proxy de CF Worker listo para desplegar en proxy/. Despliega con:

cd proxy && npx wrangler deploy

⚠️ Limitación de CF Worker: Muchos portales .go.id están a su vez detrás de Cloudflare. Los CF Workers que hacen llamadas fetch() a otros orígenes protegidos por CF reciben errores 403/522. Esta es una limitación conocida de Cloudflare.

Verificado a través del proxy de CF Worker:

Portal

Estado

Notas

data.bmkg.go.id

✅ Funciona

API JSON, no está detrás de CF

cekbpom.pom.go.id

❌ 403/522

El portal está protegido por CF

api.ojk.go.id

❌ DNS sin resolver

NXDOMAIN desde marzo de 2026

infopemilu.kpu.go.id

❌ 403

Protegido por CF

lpse.*.go.id

❌ 403

Protegido por CF

elhkpn.kpk.go.id

✅ 200

reCAPTCHA v3 resuelto con el navegador headless de Playwright

Para producción con portales protegidos por CF, usa una VPS de Indonesia con un proxy SOCKS5/HTTP y establece PROXY_MODE=connect.

Resultados de las pruebas de restricción geográfica (marzo de 2026)

Probado desde tres ubicaciones para mapear qué portales aplican bloqueo geográfico frente a WAF:

Portal

Sídney (AU)

Singapur

Yakarta (ID)

Veredicto

ahu.go.id

Bloqueo geográfico (SEA+ OK)

elhkpn.kpk.go.id

Bloqueo geográfico (SEA+ OK)

ojk.go.id

❌ 403

❌ 403

Solo ID

jaga.id (KPK)

Sin restricción

data.bmkg.go.id

Sin restricción

cekbpom.pom.go.id

⚠️

⚠️

⚠️

Protegido por CF (todas las ubicaciones)

webapi.bps.go.id

❌ 403

❌ 403

❌ 403

WAF, no geográfico (requiere clave API)

lpse.lkpp.go.id

No fiable (todas las ubicaciones)

coretaxdjp.pajak.go.id

No fiable (todas las ubicaciones)

Conclusión: Un proxy indonesio (p. ej., CloudKilat Yakarta) desbloquea OJK, el portal con restricción geográfica más importante. Singapur desbloquea AHU + LHKPN. Los fallos de BPS y LPSE no están relacionados con la geolocalización.

Lección sobre el endurecimiento de VPS

⚠️ Nunca deshabilites la autenticación por contraseña y reinicies sshd en un único script automatizado en un VPS nuevo. Si la clave SSH no se copió correctamente, te quedas bloqueado sin posibilidad de recuperación salvo la consola web. Siempre: (1) copia la clave, (2) verifica que el inicio de sesión con clave funciona en una sesión separada, (3) entonces deshabilita la autenticación por contraseña.

Estabilidad de las URL de los portales

Los portales gubernamentales indonesios cambian con frecuencia su estructura de URL sin previo aviso. Cambios conocidos a marzo de 2026:

Módulo

URL antigua

URL nueva

Estado

BPOM

/index.php/home/produk/1/{keyword}/...

/all-produk?q={keyword}

✅ Actualizado

KPU

/Pemilu/caleg/list

/Pemilu/Peserta_pemilu

✅ Actualizado

BMKG

/DataMKG/MEWS/Warning/cuacasignifikan.json

/DataMKG/TEWS/gempadirasakan.json

✅ Actualizado

LHKPN

/portal/user/check_search_announ

reCAPTCHA v3 (Playwright)

🟢 Activo

Los módulos que fallan durante 60 días se marcan como DEGRADED y pueden archivarse.

Módulos basados en navegador

Algunos portales requieren un navegador real (renderizado de JavaScript, protección antibots):

Módulo

Navegador

Antibots

bpjph

Playwright (Chromium)

Estándar

ahu

Playwright + Camoufox

Gestión de bots (bloqueo de IP de centros de datos)

oss_nib

Playwright (Chromium)

Estándar

Instala las dependencias del navegador:

pip install ".[playwright]"
playwright install chromium

# For AHU (optional, improves success rate):
pip install camoufox && python -m camoufox fetch

Claves API

Módulo

Clave requerida

Variable de entorno

Registro

BPS

BPS_API_KEY

webapi.bps.go.id/developer/register (gratis)

Todos los demás

No

Sin BPS_API_KEY, el módulo BPS devuelve un sobre de error (no un fallo):

{"status": "ERROR", "detail": "BPS_API_KEY not set. Register at ..."}

Inventario de herramientas MCP

Los 11 módulos exponen 40 herramientas MCP en total:

Módulo

Herramientas

Recuento

bpom

check_bpom, search_bpom, get_bpom_status

3

bpjph

check_halal_cert, lookup_halal_by_product, get_halal_status, cross_reference_halal_bpom

4

ahu

lookup_company_ahu, get_company_directors, verify_company_status, search_companies_ahu

4

ojk

check_ojk_license, search_ojk_institutions, get_ojk_status, check_ojk_waspada

4

oss_nib

lookup_nib, verify_nib, search_oss_businesses

3

lpse

lookup_vendor_lpse, search_lpse_vendors, search_lpse_tenders, get_lpse_portals

4

kpu

get_candidate, search_kpu_candidates, get_election_results_kpu, get_campaign_finance_kpu

4

lhkpn

get_lhkpn, search_lhkpn, compare_lhkpn, get_lhkpn_pdf

4

bps

search_bps_datasets, get_bps_indicator, list_bps_regions

3

bmkg

get_bmkg_alerts, get_weather_forecast, get_earthquake_history, get_latest_earthquake

4

simbg

lookup_building_permit, search_permits_by_area, list_simbg_portals

3


Integración con agentes de IA

Este repositorio está diseñado para agentes de IA como consumidores de primera clase.

Para agentes de codificación de IA

Archivo

Propósito

Agente

AGENTS.md

Arquitectura, patrones, reglas críticas, trampas

Todos los agentes de codificación

CLAUDE.md

Comandos, reglas de hacer/no hacer, guía de estilo

Claude Code

.cursorrules

Reglas del proyecto para Cursor

Cursor

.github/copilot-instructions.md

Instrucciones para Copilot

GitHub Copilot

CONTRIBUTING.md

Contrato de módulo + lista de verificación de PR

Todos

SKILL.md

Descubrimiento de habilidades (formato AgentSkills)

Agentes con capacidad de habilidades

PROMPTS.md

Ejemplos de prompts + recetas de artefactos interactivos

Todos los agentes de IA

Conectar herramientas MCP (elige una)

Opción A — Servidor remoto autoalojado (despliega el tuyo):

Desplegar en Railway

# After deploying to Railway/Fly/Render, add to Claude Code:
claude mcp add civic-stack --transport http https://your-deployment.up.railway.app/mcp

# Or Claude Desktop — add to claude_desktop_config.json:
{
  "mcpServers": {
    "civic-stack": {
      "transport": "streamable-http",
      "url": "https://your-deployment.up.railway.app/mcp"
    }
  }
}

Nota: No existe un servidor alojado compartido. Cada usuario despliega su propia instancia para controlar la configuración de proxy, los límites de velocidad y las claves API.

Opción B — Instalación local mediante pip:

pip install "indonesia-civic-stack[mcp]"
claude mcp add civic-stack -- civic-stack-mcp

Opción C — Clonar el repositorio (autodetección):

git clone https://github.com/suryast/indonesia-civic-stack.git
cd indonesia-civic-stack
pip install -e ".[mcp]"
claude  # Claude Code auto-detects .mcp.json — 40 tools available immediately

Las tres opciones te dan las mismas 40 herramientas. Luego pregunta:

"Comprueba si el registro BPOM MD 123456789 sigue activo" "Busca empresas llamadas 'Maju Bersama' en el registro AHU" "¿Cuál fue el último terremoto en Indonesia?"

Consulta PROMPTS.md para más ejemplos de prompts y recetas de artefactos interactivos.

API REST

pip install "indonesia-civic-stack[api]"
civic-stack api --port 8000
# GET http://localhost:8000/bpom/search?q=paracetamol

Ejemplos de prompts

Una vez conectadas las herramientas MCP, prueba estos con tu agente de IA:

Seguridad alimentaria "Comprueba si el número de registro BPOM MD 123456789 sigue activo" "Busca todos los productos de paracetamol registrados en BPOM"

Verificación halal "¿El producto XYZ tiene certificación halal? Contrasta con el registro BPOM" "Encuentra todos los certificados halal emitidos a PT Indofood"

Debida diligencia de empresas "Consulta PT Maju Bersama en el registro de empresas AHU y comprueba quiénes son los directores" "¿Esta empresa tiene licencia de OJK? Comprueba tanto el registro de licencias como la lista waspada (de advertencia)"

Finanzas públicas "Busca declaraciones de patrimonio LHKPN de funcionarios en Yakarta" "Encuentra licitaciones de contratación pública para construcción de carreteras en LPSE"

Desastres y meteorología "¿Cuál fue el último terremoto en Indonesia?" "Obtén la previsión meteorológica para DKI Yakarta de BMKG"

Estadísticas "Encuentra conjuntos de datos BPS sobre tasas de pobreza por provincia" "Obtén el indicador de inflación de los últimos 5 años"

Consultas multifuente "Quiero verificar una empresa alimentaria: consulta AHU para el registro, OJK para la licencia financiera, BPOM para los registros de productos y BPJPH para los certificados halal" "Compara las declaraciones de patrimonio LHKPN de estos dos funcionarios en los últimos 3 períodos de declaración"

Decisiones de diseño para agentes de IA

  1. Sobre de respuesta uniforme — cada herramienta devuelve CivicStackResponse con los mismos campos. Los agentes no necesitan lógica de análisis específica por módulo.

  2. Sobres de error, no excepciones — los agentes reciben información de error estructurada sobre la que pueden razonar, no trazas de pila.

  3. Herramientas autodocumentadas — las descripciones de las herramientas MCP incluyen tipos de parámetros, valores esperados y formato de respuesta.

  4. Nomenclatura determinista — patrón check_<módulo>, search_<módulo>, get_<módulo>_status en todos los módulos.


Seguridad

Característica

Configuración

Valor predeterminado

Autenticación por clave API

Variable de entorno CIVIC_API_KEY

Deshabilitada (abierta)

Límite de velocidad

Variable de entorno CIVIC_RATE_LIMIT

60 solicitudes/min por IP

Lista de proxies permitidos

Variable de entorno CIVIC_ALLOWED_PROXIES

Cualquier IP no privada

Prevención de SSRF

Integrada

Bloquea RFC 1918 + localhost

Usuario del contenedor

Dockerfile

No root (civicapp, uid 1000)

# Production deployment
export CIVIC_API_KEY="your-secret-key"
export CIVIC_RATE_LIMIT=30                          # 30 req/min
export CIVIC_ALLOWED_PROXIES="proxy.example.com"    # optional proxy allowlist
export PROXY_URL="socks5://id-proxy:1080"           # Indonesian proxy
uvicorn app:app --host 0.0.0.0 --port 8000

Docker

docker compose up                             # All modules
docker build -t civic-bpom civic_stack/bpom/      # Individual
docker run -p 8001:8000 -e CIVIC_API_KEY=secret -e PROXY_URL=socks5://proxy:1080 civic-bpom

Desarrollo

git clone https://github.com/suryast/indonesia-civic-stack.git
cd indonesia-civic-stack
python -m venv .venv && source .venv/bin/activate
pip install -e ".[all,dev]"
playwright install chromium

pytest -v              # VCR replay — no live portal calls
ruff check .           # Lint
ruff format --check .  # Format check
mypy shared/           # Type check

Pruebas

pytest -v                       # 89 tests, VCR replay (no live calls)
pytest tests/bpom/ -v           # Single module
pytest --tb=short -q            # Quick summary
pie title Test Coverage (89 tests)
    "BPOM" : 7
    "BPJPH" : 8
    "AHU" : 12
    "OJK" : 4
    "KPU" : 5
    "LPSE" : 9
    "OSS-NIB" : 6
    "LHKPN" : 10
    "BPS" : 7
    "BMKG" : 8
    "SIMBG" : 7
    "Schema" : 6

Contribuciones

Consulta CONTRIBUTING.md. Cada PR de módulo debe incluir:

  • fetch() y search() que devuelvan CivicStackResponse

  • Enrutador FastAPI + servidor FastMCP

  • 3+ accesorios de prueba VCR

  • README del módulo

Un módulo que se rompe durante 60 días se marca como DEGRADED y se archiva.


Usado por

  • halalkah.id — Verificación de productos halal (9,57 millones de productos)

  • legalkah.id — Verificador de legalidad de instituciones financieras

  • datarakyat.id — Página de inicio y documentación

Arquitecturas de ejemplo

Simple: Verificador de productos halal

Una aplicación de una sola página que comprueba si un producto tiene certificación halal. Un módulo, sin necesidad de proxy para usuarios indonesios.

graph LR
    subgraph Client
        A[Mobile App / Web]
    end

    subgraph Your Server
        B[FastAPI]
        C[bpjph module]
    end

    subgraph Government Portal
        D[sertifikasi.halal.go.id]
    end

    A -->|POST /check| B
    B --> C
    C -->|scrape| D
    D -->|HTML| C
    C -->|CivicStackResponse| B
    B -->|JSON| A

    style A fill:#f9f9f9,stroke:#333
    style B fill:#e8f5e9,stroke:#2e7d32
    style C fill:#e8f5e9,stroke:#2e7d32
    style D fill:#fff3e0,stroke:#e65100
# app.py — 15 lines, production-ready
from fastapi import FastAPI
from civic_stack.bpjph.scraper import fetch

app = FastAPI()

@app.get("/check/{product_id}")
async def check_halal(product_id: str):
    result = await fetch(product_id)
    return {"halal": result.found, "data": result.result}

Intermedia: API de debida diligencia multifuente

Una herramienta de cumplimiento que contrasta una empresa en múltiples bases de datos gubernamentales. Funciona detrás de un proxy para despliegue en el extranjero.

graph TB
    subgraph Client
        A[Compliance Dashboard]
    end

    subgraph Your Infrastructure
        B[API Gateway]
        C[Due Diligence Service]
        D[ahu module]
        E[ojk module]
        F[bpom module]
        G[oss_nib module]
        H[(Redis Cache)]
    end

    subgraph Proxy Layer
        I[CF Worker Proxy]
    end

    subgraph Government Portals
        J[ahu.go.id]
        K[www.ojk.go.id]
        L[cekbpom.pom.go.id]
        M[oss.go.id]
    end

    A -->|GET /company/:name| B
    B --> C
    C --> H
    C --> D & E & F & G
    D & E & F & G -->|via PROXY_URL| I
    I --> J & K & L & M

    style A fill:#f9f9f9,stroke:#333
    style B fill:#e3f2fd,stroke:#1565c0
    style C fill:#e8f5e9,stroke:#2e7d32
    style D fill:#e8f5e9,stroke:#2e7d32
    style E fill:#e8f5e9,stroke:#2e7d32
    style F fill:#e8f5e9,stroke:#2e7d32
    style G fill:#e8f5e9,stroke:#2e7d32
    style H fill:#fce4ec,stroke:#c62828
    style I fill:#fff8e1,stroke:#f57f17
    style J fill:#fff3e0,stroke:#e65100
    style K fill:#fff3e0,stroke:#e65100
    style L fill:#fff3e0,stroke:#e65100
    style M fill:#fff3e0,stroke:#e65100
# due_diligence.py — parallel checks across 4 portals
import asyncio
from civic_stack.ahu.scraper import search as ahu_search
from civic_stack.ojk.scraper import search as ojk_search
from civic_stack.bpom.scraper import search as bpom_search
from civic_stack.oss_nib.scraper import search as nib_search

async def check_company(name: str) -> dict:
    ahu, ojk, bpom, nib = await asyncio.gather(
        ahu_search(name),
        ojk_search(name),
        bpom_search(name),
        nib_search(name),
    )
    return {
        "company": name,
        "registered": any(r.found for r in ahu),
        "ojk_licensed": any(r.found for r in ojk),
        "bpom_products": len([r for r in bpom if r.found]),
        "nib_valid": any(r.found for r in nib),
        "risk_flags": _assess_risk(ahu, ojk, bpom, nib),
    }

Avanzada: Agente de IA con herramientas MCP

Un asistente de IA que responde preguntas en lenguaje natural sobre datos cívicos indonesios mediante herramientas MCP. El agente razona sobre qué portales consultar.

sequenceDiagram
    participant User
    participant Agent as AI Agent (Claude/GPT)
    participant MCP as MCP Server
    participant SDK as civic-stack modules
    participant Proxy as CF Worker Proxy
    participant Gov as Government Portals

    User->>Agent: "Is PT Maju Bersama a legitimate company<br/>with halal certification?"

    Note over Agent: Agent reasons: need AHU (company)<br/>+ BPJPH (halal) + OJK (finance)

    Agent->>MCP: search_companies_ahu("PT Maju Bersama")
    MCP->>SDK: ahu.search()
    SDK->>Proxy: GET ahu.go.id/...
    Proxy->>Gov: Forward request
    Gov-->>Proxy: HTML response
    Proxy-->>SDK: Response
    SDK-->>MCP: CivicStackResponse
    MCP-->>Agent: {found: true, status: "ACTIVE", ...}

    Agent->>MCP: check_halal_cert("PT Maju Bersama")
    MCP->>SDK: bpjph.fetch()
    SDK->>Proxy: GET sertifikasi.halal.go.id/...
    Proxy-->>SDK: Response
    SDK-->>MCP: CivicStackResponse
    MCP-->>Agent: {found: true, status: "ACTIVE", ...}

    Agent->>MCP: check_ojk_license("PT Maju Bersama")
    MCP->>SDK: ojk.fetch()
    SDK-->>MCP: {found: false, status: "NOT_FOUND"}

    Note over Agent: Agent synthesizes results

    Agent->>User: "PT Maju Bersama is a registered company (AHU ✅)<br/>with active halal certification (BPJPH ✅).<br/>No OJK financial license found — this is normal<br/>for non-financial companies."
# Connect MCP servers to Claude Desktop — one command per module
claude mcp add civic-ahu   -- python -m civic_stack.ahu.server
claude mcp add civic-bpjph -- python -m civic_stack.bpjph.server
claude mcp add civic-ojk   -- python -m civic_stack.ojk.server

# Or run unified REST API for HTTP-based agents
PROXY_URL=https://your-proxy.workers.dev uvicorn app:app

Relacionados

  • indonesia-civic-signal-monitor — Motor de detección de anomalías construido sobre este SDK, supervisa 11 fuentes de datos gubernamentales para detectar cambios noticiables

  • indonesia-gov-apis — Documentación de referencia para más de 50 API gubernamentales de Indonesia

  • datarakyat.id — Página principal del proyecto con documentación completa de los módulos

Licencia

MIT — consulta LICENSE

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
16dResponse time
3dRelease cycle
5Releases (12mo)
Commit activity
Issues opened vs closed

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides seamless access to Malaysia's official government data catalogue, enabling developers to discover, explore, and fetch datasets from the Malaysian government's open data platform through a simple, unified interface.
    4
    14
    10
    ISC
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides a ready-to-run MCP server and Python SDK for securely interacting with Openapi.com APIs, enabling businesses to retrieve official documents and data through natural language.
    19
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Citation-first MCP server for official Indonesian financial data from IDX, BPS, and KSEI, providing tools to access company profiles, financial reports, statistical tables, and investor demographics.
    10
    MIT

View all related MCP servers

Related MCP Connectors

  • This MCP server provides seamless access to Malaysia's government open data, including datasets, w…

  • Apideck Unified API MCP — 330 tools across 200+ SaaS connectors (accounting, CRM, HRIS, ATS).

  • One MCP for 160+ live web-data APIs — clean JSON from sites that block scrapers.

View all MCP Connectors

Latest Blog Posts

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/suryast/indonesia-civic-stack'

If you have feedback or need assistance with the MCP directory API, please join our Discord server