indonesia-civic-stack
🇮🇩 indonesia-civic-stack
Готовые к продакшену скрейперы, нормализаторы и API-обёртки для правительственных источников данных Индонезии.
Инфраструктурный слой, лежащий в основе halalkah.id, legalkah.id, и общественное благо для индонезийского сообщества civic tech и разработчиков.
Зачем
Индонезийские открытые данные формально открыты, но практически недоступны. Каждый разработчик, создающий гражданские инструменты, заново решает одни и те же задачи скрейпинга: регистрации продуктов BPOM, халяльные сертификаты BPJPH, записи компаний AHU. Скрейперы приходят в негодность за считанные месяцы, когда порталы меняются. Не существует общего поддерживаемого слоя.
Этот репозиторий и есть такой слой. Один pip install для запросов к правительственным порталам Индонезии — никаких больше самодельных скрейперов.
В первую очередь для ИИ-агентов
Этот SDK предназначен и для людей, и для ИИ-агентов:
🤖 46 MCP-инструментов — подключайтесь к Claude, GPT или любому MCP-совместимому агенту
📋 SKILL.md — обнаружение навыков ИИ-агента (формат AgentSkills)
🧑💻 AGENTS.md — архитектурное руководство для агентов-программистов (Claude Code, Codex, Cursor)
📝 CLAUDE.md — инструкции, специфичные для Claude Code
✅ Типизированные ответы — обёртка
CivicStackResponse, никогда не сырые словари🔁 Единообразные паттерны — каждый модуль следует одному и тому же контракту
Related MCP server: openapi-mcp-sdk
Архитектура
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Поток запросов
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Статус модулей
Модуль | Источник | Данные | Прокси | Статус |
cekbpom.pom.go.id | Регистрации продуктов питания, лекарств, косметики | 🌐 | ✅ Активен | |
cmsbl.halal.go.id | Халяльные сертификаты (1.98M+ записей) | 🌐 | ✅ Активен — переведён на REST API (v1.0.0) | |
ahu.go.id | Реестр компаний — PT, CV, Yayasan, Koperasi | 🇮🇩 | ⚠️ Страница переструктурирована — изменилось поле поиска (апр. 2026) | |
Лицензированные финансовые организации + список Waspada | 🇮🇩 | ⚠️ Портал переведён на SharePoint (апр. 2026) — скрейпер нужно переписать | ||
oss.go.id | Бизнес-идентификатор (NIB) | 🇮🇩 | ⚠️ Страница переструктурирована — Playwright не находит поля ввода (апр. 2026) | |
spse.inaproc.id | Государственные закупки | 🇮🇩 | ✅ Активен — больше не deprecated (v1.0.0) | |
infopemilu.kpu.go.id | Данные выборов — кандидаты, результаты, финансы | 🌐 | ✅ Активен | |
webapi.bps.go.id | Статистические наборы данных (1,000+) | 🌐 | ✅ Активен (требуется | |
data.bmkg.go.id | Данные о погоде, землетрясениях и стихийных бедствиях | 🌐 | ✅ Активен | |
simbg.pu.go.id | Разрешения на строительство (PBG) — мультипортальные | 🌐 | ✅ Активен | |
peraturan.go.id | Национальная правовая база — UU, PP, Perpres, Permen | 🇮🇩 | ✅ Новый — скрейпинг через Playwright | |
web.ksei.co.id | Статистика по ценным бумагам (62 ежемесячных PDF) + зарегистрированные ценные бумаги | 🌐 | ✅ Новый — HTML-скрейпинг (прокси не нужен) | |
data-apbn.kemenkeu.go.id | Темы бюджета APBN — план/исполнение/достижение | 🇮🇩 | ✅ Новый — чистый REST JSON API | |
elhkpn.kpk.go.id | Декларации об имуществе (чиновников) | — | ✅ Активен — reCAPTCHA v3 решается через Playwright |
🌐 = работает глобально 🇮🇩 = требует индонезийский прокси (задайте PROXY_URL)
Каждый модуль возвращает одну и ту же обёртку CivicStackResponse — меняйте источники данных, не трогая логику приложения.
Зрелость модулей
Модуль | Скрейпер | Нормализатор | MCP | Тесты | Статус портала |
bpom | ✅ | ✅ | ✅ | ✅ | ✅ |
bpjph | ✅ | ✅ | ✅ | ✅ | ✅ REST API |
ahu | ✅ | ✅ | ✅ | ✅ | ⚠️ страница переструктурирована |
ojk | ✅ | ✅ | ✅ | ✅ | ⚠️ миграция на SharePoint |
oss_nib | ✅ | ✅ | ✅ | ✅ | ⚠️ страница переструктурирована |
lpse | ✅ | ✅ | ✅ | ✅ | 🇮🇩 гео-блокировка |
kpu | ✅ | ✅ | ✅ | ✅ | ✅ |
bps | ✅ | ✅ | ✅ | ✅ | ✅ |
bmkg | ✅ | ✅ | ✅ | ✅ | ✅ |
simbg | ✅ | ✅ | ✅ | ✅ | ✅ |
jdih | ✅ | ✅ | ❌ | ❌ | 🇮🇩 Playwright |
ksei | ✅ | ✅ | ❌ | ❌ | ✅ (прокси не нужен) |
djpb | ✅ | ✅ | ❌ | ❌ | ✅ REST JSON API |
lhkpn | ✅ | ✅ | ✅ | ✅ | ✅ Активен (Playwright) |
Быстрый старт
Установка
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]" # EverythingPython SDK
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())MCP-сервер (для ИИ-агентов)
Все 14 модулей предоставляют 46 MCP-инструментов для использования с Claude, GPT или любым 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Классы MCP-серверов поддерживают два стиля инициализации:
# Style 1: Explicit init
class BpomMCPServer(CivicStackMCPBase):
def __init__(self):
super().__init__("bpom")
# Style 2: Class attribute
class BmkgMCPServer(CivicStackMCPBase):
module_name = "bmkg"REST API
# 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Обёртка ответа
Каждый модуль возвращает 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"
}Значения статуса: ACTIVE, EXPIRED, SUSPENDED, REVOKED, NOT_FOUND, ERROR.
Когда модуль не может получить доступ к своему порталу или отсутствует конфигурация (например, BPS_API_KEY), он возвращает обёртку с ошибкой вместо того, чтобы аварийно завершиться:
{
"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"
}Внутреннее устройство модулей
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Слой shared/ предоставляет:
schema.py— модель PydanticCivicStackResponse, перечисление статусов, вспомогательные конструкторыhttp.py— фабрикаcivic_client()с автоматическим прокси, ограничителем скорости, повторными попытками с экспоненциальной задержкой и переписыванием URL для прокси на CF Workermcp.py— абстрактный базовый классCivicStackMCPBaseдля MCP-серверов
Примечания по развёртыванию
Гео-блокировка и требования к прокси
Большинство индонезийских правительственных порталов (*.go.id) ограничивают доступ, разрешая его только индонезийским IP-адресам. Если вы разворачиваете приложение за пределами Индонезии, вы обязаны задать PROXY_URL, чтобы направлять запросы через индонезийский endpoint.
# 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Без прокси ожидайте: сбои разрешения DNS, таймауты соединения или ответы HTTP 403/404 от большинства модулей.
SDK автоматически читает PROXY_URL из окружения — никаких изменений кода в скрейперах или MCP-серверах не требуется.
Режимы прокси
Режим | Пример | Как работает |
|
| Стандартный HTTP/SOCKS CONNECT-прокси через транспорт httpx |
|
| Переписывает URL в |
| (не задан) | Прямое соединение |
Переопределите автоматическое определение с помощью PROXY_MODE=connect|rewrite.
Прокси на CF Worker
Готовый к развёртыванию прокси на CF Worker включён в proxy/. Разверните с помощью:
cd proxy && npx wrangler deploy⚠️ Ограничение CF Worker: Многие порталы
.go.idсами находятся за Cloudflare. CF Workers, выполняющие вызовыfetch()к другим источникам, защищённым CF, получают ошибки 403/522. Это известное ограничение Cloudflare.
Проверено через прокси CF Worker:
Портал | Статус | Примечания |
data.bmkg.go.id | ✅ Работает | JSON API, не за CF |
cekbpom.pom.go.id | ❌ 403/522 | Портал защищён CF |
api.ojk.go.id | ❌ DNS не работает | NXDOMAIN с марта 2026 |
infopemilu.kpu.go.id | ❌ 403 | Защищён CF |
lpse.*.go.id | ❌ 403 | Защищён CF |
elhkpn.kpk.go.id | ✅ 200 | reCAPTCHA v3 решается через headless-браузер Playwright |
Для продакшена с порталами, защищёнными CF, используйте индонезийский VPS с прокси SOCKS5/HTTP и установите PROXY_MODE=connect.
Результаты проверки гео-ограничений (март 2026)
Проверено из трёх местоположений, чтобы определить, какие порталы применяют гео-блокировку, а какие WAF:
Портал | Сидней (AU) | Сингапур | Джакарта (ID) | Вердикт |
ahu.go.id | ❌ | ✅ | ✅ | Гео-блокировка (SEA+ OK) |
elhkpn.kpk.go.id | ❌ | ✅ | ✅ | Гео-блокировка (SEA+ OK) |
ojk.go.id | ❌ 403 | ❌ 403 | ✅ | Только ID |
jaga.id (KPK) | ✅ | ✅ | ✅ | Без ограничений |
data.bmkg.go.id | ✅ | ✅ | ✅ | Без ограничений |
cekbpom.pom.go.id | ⚠️ | ⚠️ | ⚠️ | Защита CF (все локации) |
webapi.bps.go.id | ❌ 403 | ❌ 403 | ❌ 403 | WAF, не гео (нужен API-ключ) |
lpse.lkpp.go.id | ❌ | ❌ | ❌ | Нестабильный (все локации) |
coretaxdjp.pajak.go.id | ❌ | ❌ | ❌ | Нестабильный (все локации) |
Вывод: Индонезийский прокси (например, CloudKilat Jakarta) открывает доступ к OJK — самому важному гео-ограниченному порталу. Сингапур открывает AHU + LHKPN. Сбои BPS и LPSE не связаны с гео-блокировками.
Урок по усилению защиты VPS
⚠️ Никогда не отключайте парольную аутентификацию и не перезапускайте sshd одним автоматизированным скриптом на свежем VPS. Если SSH-ключ был скопирован неправильно, вы будете заблокированы без возможности восстановления, кроме веб-консоли. Всегда: (1) копируйте ключ, (2) проверяйте, что вход по ключу работает в отдельной сессии, (3) только затем отключайте парольную аутентификацию.
Стабильность URL-адресов порталов
Индонезийские государственные порталы часто меняют структуру URL без предупреждения. Известные изменения по состоянию на март 2026 года:
Модуль | Старый URL | Новый URL | Статус |
BPOM |
|
| ✅ Обновлён |
KPU |
|
| ✅ Обновлён |
BMKG |
|
| ✅ Обновлён |
LHKPN |
| reCAPTCHA v3 (Playwright) | 🟢 Активен |
Модули, которые не работают в течение 60 дней, помечаются как DEGRADED и могут быть архивированы.
Модули на основе браузера
Некоторые порталы требуют настоящий браузер (рендеринг JavaScript, защита от ботов):
Модуль | Браузер | Анти-бот |
bpjph | Playwright (Chromium) | Стандартная |
ahu | Playwright + Camoufox | Управление ботами (блокировка IP дата-центров) |
oss_nib | Playwright (Chromium) | Стандартная |
Установка зависимостей браузера:
pip install ".[playwright]"
playwright install chromium
# For AHU (optional, improves success rate):
pip install camoufox && python -m camoufox fetchAPI-ключи
Модуль | Требуется ключ | Переменная окружения | Регистрация |
BPS | Да |
| webapi.bps.go.id/developer/register (бесплатно) |
Все остальные | Нет | — | — |
Без BPS_API_KEY модуль BPS возвращает конверт ошибки (не падение):
{"status": "ERROR", "detail": "BPS_API_KEY not set. Register at ..."}Инвентаризация MCP-инструментов
Все 11 модулей предоставляют 40 MCP-инструментов в общей сложности:
Модуль | Инструменты | Кол-во |
bpom |
| 3 |
bpjph |
| 4 |
ahu |
| 4 |
ojk |
| 4 |
oss_nib |
| 3 |
lpse |
| 4 |
kpu |
| 4 |
lhkpn |
| 4 |
bps |
| 3 |
bmkg |
| 4 |
simbg |
| 3 |
Интеграция с AI-агентами
Этот репозиторий создан с расчётом на AI-агентов как основных потребителей.
Для AI-агентов кодирования
Файл | Назначение | Агент |
Архитектура, паттерны, критические правила, подводные камни | Все агенты кодирования | |
Команды, правила «делать/не делать», руководство по стилю | Claude Code | |
Правила проекта для Cursor | Cursor | |
Инструкции для Copilot | GitHub Copilot | |
Контракт модуля + чек-лист PR | Все | |
Обнаружение навыков (формат AgentSkills) | Агенты с поддержкой навыков | |
Примеры промптов + рецепты интерактивных артефактов | Все AI-агенты |
Подключение MCP-инструментов (выберите один вариант)
Вариант A — Самостоятельно размещённый удалённый сервер (разверните свой):
# 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"
}
}
}Примечание: Общего размещённого сервера не существует. Каждый пользователь разворачивает собственный экземпляр для управления настройками прокси, лимитами скорости и API-ключами.
Вариант B — Локальная установка через pip:
pip install "indonesia-civic-stack[mcp]"
claude mcp add civic-stack -- civic-stack-mcpВариант C — Клонирование репозитория (автообнаружение):
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Все три варианта дают вам одни и те же 40 инструментов. Затем спросите:
«Проверь, активна ли ещё регистрация BPOM MD 123456789» «Найди компании с названием "Maju Bersama" в реестре AHU» «Какое было последнее землетрясение в Индонезии?»
Дополнительные примеры промптов и рецепты интерактивных артефактов см. в PROMPTS.md.
REST API
pip install "indonesia-civic-stack[api]"
civic-stack api --port 8000
# GET http://localhost:8000/bpom/search?q=paracetamolПримеры промптов
После подключения MCP-инструментов попробуйте эти запросы со своим AI-агентом:
Безопасность пищевых продуктов «Проверь, активен ли регистрационный номер BPOM
MD 123456789» «Найди все продукты с парацетамолом, зарегистрированные в BPOM»
Проверка халяльности «Сертифицирован ли продукт XYZ как халяльный? Сверь с регистрацией BPOM» «Найди все халяльные сертификаты, выданные PT Indofood»
Проверка компании «Найди PT Maju Bersama в реестре компаний AHU и проверь, кто директора» «Есть ли у этой компании лицензия OJK? Проверь и реестр лицензий, и список waspada (предупреждений)»
Государственные финансы «Найди декларации о доходах LHKPN для чиновников в Джакарте» «Найди тендеры на строительство дорог на LPSE»
Катастрофы и погода «Какое было последнее землетрясение в Индонезии?» «Получи прогноз погоды для DKI Jakarta от BMKG»
Статистика «Найди наборы данных BPS об уровне бедности по провинциям» «Получи показатель инфляции за последние 5 лет»
Многоисточниковые запросы «Я хочу проверить пищевую компанию: проверь AHU на регистрацию, OJK на финансовую лицензию, BPOM на регистрацию продуктов и BPJPH на халяльные сертификаты» «Сравни декларации LHKPN этих двух чиновников за последние 3 отчётных периода»
Проектные решения для AI-агентов
Единый конверт ответа — каждый инструмент возвращает
CivicStackResponseс одинаковыми полями. Агентам не нужна логика разбора для конкретных модулей.Конверты ошибок, а не исключения — агенты получают структурированную информацию об ошибках, которую можно анализировать, а не трассировки стека.
Самодокументируемые инструменты — описания MCP-инструментов включают типы параметров, ожидаемые значения и формат ответа.
Детерминированные имена — паттерн
check_<module>,search_<module>,get_<module>_statusво всех модулях.
Безопасность
Функция | Конфигурация | По умолчанию |
Аутентификация по API-ключу | Переменная окружения | Отключена (открытый доступ) |
Ограничение скорости | Переменная окружения | 60 запросов/мин на IP |
Белый список прокси | Переменная окружения | Любой не частный IP |
Защита от SSRF | Встроенная | Блокирует RFC 1918 + localhost |
Пользователь контейнера | Dockerfile | Не 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-bpomРазработка
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Тесты
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" : 6Участие в разработке
См. CONTRIBUTING.md. Каждый PR модуля должен включать:
fetch()иsearch(), возвращающиеCivicStackResponseРоутер FastAPI + сервер FastMCP
3+ VCR-фикстуры для тестов
README модуля
Модуль, который не работает в течение 60 дней, помечается как DEGRADED и архивируется.
Используется в
halalkah.id — Проверка халяльности продуктов (9,57 млн продуктов)
legalkah.id — Проверка легальности финансовых учреждений
datarakyat.id — Целевая страница и документация
Примеры архитектур
Простая: Проверка халяльности продукта
Одностраничное приложение, которое проверяет, сертифицирован ли продукт как халяльный. Один модуль, прокси не нужен для пользователей в Индонезии.
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}Средняя: API комплексной проверки из нескольких источников
Инструмент комплаенса, который перекрёстно проверяет компанию по нескольким государственным базам данных. Работает за прокси для зарубежного развёртывания.
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),
}Продвинутая: AI-агент с MCP-инструментами
AI-ассистент, который отвечает на вопросы на естественном языке об индонезийских гражданских данных с помощью MCP-инструментов. Агент рассуждает о том, какие порталы запрашивать.
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Связанные проекты
indonesia-civic-signal-monitor — Движок обнаружения аномалий, построенный на этом SDK, отслеживает 11 государственных источников данных на предмет значимых изменений
indonesia-gov-apis — Справочная документация по 50+ индонезийским государственным API
datarakyat.id — Домашняя страница проекта с полной документацией по модулям
Лицензия
MIT — см. 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