indonesia-civic-stack
🇮🇩 indonesia-civic-stack
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 --> P11Flujo 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: CivicStackResponseEstado de los módulos
Módulo | Fuente | Datos | Proxy | Estado |
cekbpom.pom.go.id | Registros de alimentos, medicamentos y cosméticos | 🌐 | ✅ Activo | |
cmsbl.halal.go.id | Certificados halal (1.98M+ registros) | 🌐 | ✅ Activo — migrado a API REST (v1.0.0) | |
ahu.go.id | Registro de empresas — PT, CV, Yayasan, Koperasi | 🇮🇩 | ⚠️ Página reestructurada — cambió el campo de búsqueda (abr 2026) | |
Instituciones financieras autorizadas + lista Waspada | 🇮🇩 | ⚠️ Portal migrado a SharePoint (abr 2026) — el scraper necesita reescribirse | ||
oss.go.id | Identidad empresarial (NIB) | 🇮🇩 | ⚠️ Página reestructurada — Playwright no encuentra los campos de entrada (abr 2026) | |
spse.inaproc.id | Contratación pública | 🇮🇩 | ✅ Activo — ya no está deprecado (v1.0.0) | |
infopemilu.kpu.go.id | Datos electorales — candidatos, resultados, financiación | 🌐 | ✅ Activo | |
webapi.bps.go.id | Conjuntos de datos estadísticos (1,000+) | 🌐 | ✅ Activo (requiere | |
data.bmkg.go.id | Datos meteorológicos, de terremotos y de desastres | 🌐 | ✅ Activo | |
simbg.pu.go.id | Permisos de construcción (PBG) — multiportal | 🌐 | ✅ Activo | |
peraturan.go.id | Base de datos jurídica nacional — UU, PP, Perpres, Permen | 🇮🇩 | ✅ Nuevo — scraping con Playwright | |
web.ksei.co.id | Estadísticas de valores (62 PDF mensuales) + valores registrados | 🌐 | ✅ Nuevo — scraping HTML (sin necesidad de proxy) | |
data-apbn.kemenkeu.go.id | Temas presupuestarios APBN — objetivo/realización/logro | 🇮🇩 | ✅ Nuevo — API JSON REST limpia | |
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]" # EverythingSDK 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 belowLas 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+SelatanEnvoltorio 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.mdLa capa shared/ proporciona:
schema.py— modelo PydanticCivicStackResponse, enumeración de estado, constructores auxiliareshttp.py— fábricacivic_client()con proxy automático, limitador de frecuencia, reintento con retroceso exponencial y reescritura de URLs para proxies de CF Workermcp.py— clase base abstractaCivicStackMCPBasepara 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.devSin 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 | Cómo funciona |
|
| Proxy estándar HTTP/SOCKS CONNECT mediante transporte httpx |
|
| Reescribe las URLs a |
| (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.idestán a su vez detrás de Cloudflare. Los CF Workers que hacen llamadasfetch()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 |
|
| ✅ Actualizado |
KPU |
|
| ✅ Actualizado |
BMKG |
|
| ✅ Actualizado |
LHKPN |
| 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 fetchClaves API
Módulo | Clave requerida | Variable de entorno | Registro |
BPS | Sí |
| 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 |
| 3 |
bpjph |
| 4 |
ahu |
| 4 |
ojk |
| 4 |
oss_nib |
| 3 |
lpse |
| 4 |
kpu |
| 4 |
lhkpn |
| 4 |
bps |
| 3 |
bmkg |
| 4 |
simbg |
| 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 |
Arquitectura, patrones, reglas críticas, trampas | Todos los agentes de codificación | |
Comandos, reglas de hacer/no hacer, guía de estilo | Claude Code | |
Reglas del proyecto para Cursor | Cursor | |
Instrucciones para Copilot | GitHub Copilot | |
Contrato de módulo + lista de verificación de PR | Todos | |
Descubrimiento de habilidades (formato AgentSkills) | Agentes con capacidad de habilidades | |
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):
# 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-mcpOpció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 immediatelyLas 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=paracetamolEjemplos 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 123456789sigue 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
Sobre de respuesta uniforme — cada herramienta devuelve
CivicStackResponsecon los mismos campos. Los agentes no necesitan lógica de análisis específica por módulo.Sobres de error, no excepciones — los agentes reciben información de error estructurada sobre la que pueden razonar, no trazas de pila.
Herramientas autodocumentadas — las descripciones de las herramientas MCP incluyen tipos de parámetros, valores esperados y formato de respuesta.
Nomenclatura determinista — patrón
check_<módulo>,search_<módulo>,get_<módulo>_statusen todos los módulos.
Seguridad
Característica | Configuración | Valor predeterminado |
Autenticación por clave API | Variable de entorno | Deshabilitada (abierta) |
Límite de velocidad | Variable de entorno | 60 solicitudes/min por IP |
Lista de proxies permitidos | Variable de entorno | Cualquier IP no privada |
Prevención de SSRF | Integrada | Bloquea RFC 1918 + localhost |
Usuario del contenedor | Dockerfile | No root ( |
# 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 8000Docker
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-bpomDesarrollo
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 checkPruebas
pytest -v # 89 tests, VCR replay (no live calls)
pytest tests/bpom/ -v # Single module
pytest --tb=short -q # Quick summarypie 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" : 6Contribuciones
Consulta CONTRIBUTING.md. Cada PR de módulo debe incluir:
fetch()ysearch()que devuelvanCivicStackResponseEnrutador 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:appRelacionados
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
This server cannot be installed
Maintenance
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
- AlicenseAqualityDmaintenanceProvides 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.41410ISC
- AlicenseNot gradedqualityCmaintenanceProvides 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.19MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to access official Indonesian statistical data (BPS) through MCP, providing tools for dynamic data queries, foreign trade, publications, and more.1
- AlicenseBqualityBmaintenanceCitation-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.10MIT
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.
Latest 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/suryast/indonesia-civic-stack'
If you have feedback or need assistance with the MCP directory API, please join our Discord server