Skip to main content
Glama
suryast

indonesia-civic-stack

by suryast

🇮🇩 indonesia-civic-stack

PyPI MCP Registry CI Python License

用于印尼政府数据源的生产级抓取器、规范化器和 API 封装。

它是 halalkah.idlegalkah.id 之下的基础设施层,也是面向印尼公民技术与开发者社区的公共产品。


为什么

印尼的公共数据名义上是开放的,但实际上难以访问。每个构建公民工具的开发者都在独立地重复解决相同的抓取问题:BPOM 产品注册、BPJPH 清真认证、AHU 公司记录。随着门户网站不断改版,抓取器往往在数月内就会腐化失效。目前没有共享且持续维护的基础层。

这个仓库就是那个基础层。 只需一次 pip install,即可查询印尼政府门户 —— 再也无需定制抓取器。

AI-Agent 优先

本 SDK 同时面向人类和 AI 智能体设计:

  • 🤖 46 个 MCP 工具 —— 可接入 Claude、GPT 或任何兼容 MCP 的智能体

  • 📋 SKILL.md —— AI 智能体技能发现(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

模块状态

模块

数据源

数据

代理

状态

bpom

cekbpom.pom.go.id

食品、药品、化妆品注册

🌐

✅ 正常

bpjph

cmsbl.halal.go.id

清真认证(1.98M+ 条记录)

🌐

✅ 正常 —— 已迁移至 REST API(v1.0.0)

ahu

ahu.go.id

公司注册 —— PT、CV、Yayasan、Koperasi

🇮🇩

⚠️ 页面已重构 —— 搜索输入框已变更(2026 年 4 月)

ojk

www.ojk.go.id/waspada-investasi

持牌金融机构 + Waspada 名单

🇮🇩

⚠️ 门户已迁移至 SharePoint(2026 年 4 月)—— 抓取器需重写

oss_nib

oss.go.id

企业身份(NIB)

🇮🇩

⚠️ 页面已重构 —— Playwright 找不到输入框(2026 年 4 月)

lpse

spse.inaproc.id

政府采购

🇮🇩

✅ 正常 —— 取消弃用(v1.0.0)

kpu

infopemilu.kpu.go.id

选举数据 —— 候选人、结果、财务

🌐

✅ 正常

bps

webapi.bps.go.id

统计数据集(1,000+)

🌐

✅ 正常(需 BPS_API_KEY

bmkg

data.bmkg.go.id

天气、地震和灾害数据

🌐

✅ 正常

simbg

simbg.pu.go.id

建筑许可证(PBG)—— 多门户

🌐

✅ 正常

jdih

peraturan.go.id

国家法律数据库 —— UU、PP、Perpres、Permen

🇮🇩

新增 —— Playwright 抓取

ksei

web.ksei.co.id

证券统计(62 份月度 PDF)+ 注册证券

🌐

新增 —— HTML 抓取(无需代理)

djpb

data-apbn.kemenkeu.go.id

APBN 预算主题 —— 目标/实现/达成

🇮🇩

新增 —— 干净的 REST JSON API

lhkpn

elhkpn.kpk.go.id

财产申报(官员)

✅ 正常 —— 通过 Playwright 解决 reCAPTCHA v3

🌐 = 全球可用 🇮🇩 = 需要印尼代理(设置 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]"   # Everything

Python 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 服务器(面向 AI 智能体)

全部 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"
}

状态值:ACTIVEEXPIREDSUSPENDEDREVOKEDNOT_FOUNDERROR

当模块无法访问其门户或缺少配置(例如 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 —— CivicStackResponse Pydantic 模型、状态枚举、辅助构造函数

  • http.py —— civic_client() 工厂,支持自动代理、速率限制器、指数退避重试、面向 CF Worker 代理的 URL 重写

  • mcp.py —— 用于 MCP 服务器的 CivicStackMCPBase 抽象基类


部署说明

地理封锁与代理要求

大多数印尼政府门户(*.go.id)仅允许印尼 IP 地址访问。如果在印尼境外部署,必须设置 PROXY_URL,将请求路由到印尼端点。

# 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 服务器无需任何代码更改。

代理模式

模式

PROXY_URL 示例

工作原理

connect

socks5://id-proxy:1080

通过 httpx 传输层使用标准 HTTP/SOCKS CONNECT 代理

rewrite

https://x.workers.dev

将 URL 重写为 ?url=<target>(对 *.workers.dev 自动检测)

none

(未设置)

直接连接

使用 PROXY_MODE=connect|rewrite 覆盖自动检测。

CF Worker 代理

proxy/ 中包含一个可直接部署的 CF Worker 代理。部署方式:

cd proxy && npx wrangler deploy

⚠️ CF Worker 限制: 许多 .go.id 门户本身就在 Cloudflare 后面。CF Worker 向其他受 CF 保护的源站发起 fetch() 调用时,会收到 403/522 错误。这是 Cloudflare 的已知限制。

已通过 CF Worker 代理验证:

门户

状态

备注

data.bmkg.go.id

✅ 可用

JSON API,不在 CF 后面

cekbpom.pom.go.id

❌ 403/522

门户受 CF 保护

api.ojk.go.id

❌ DNS 失效

自 2026 年 3 月起为 NXDOMAIN

infopemilu.kpu.go.id

❌ 403

受 CF 保护

lpse.*.go.id

❌ 403

受 CF 保护

elhkpn.kpk.go.id

✅ 200

通过 Playwright 无头浏览器解决 reCAPTCHA v3

对于使用受 CF 保护门户的生产环境,请使用带 SOCKS5/HTTP 代理的印尼 VPS,并设置 PROXY_MODE=connect

地理限制测试结果(2026 年 3 月)

测试从三个地点进行,以摸清哪些门户实施地理封锁、哪些门户使用 WAF:

门户

悉尼(AU)

新加坡

雅加达(ID)

结论

ahu.go.id

地理封锁(东南亚地区正常)

elhkpn.kpk.go.id

地理封锁(东南亚地区正常)

ojk.go.id

❌ 403

❌ 403

仅限印尼

jaga.id (KPK)

无限制

data.bmkg.go.id

无限制

cekbpom.pom.go.id

⚠️

⚠️

⚠️

Cloudflare 保护(所有位置)

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 加固经验教训

⚠️ 切勿在新 VPS 上的一个自动化脚本中同时禁用密码认证并重启 sshd。 如果 SSH 密钥未正确复制,您将被锁定,除了 Web 控制台外没有恢复途径。请务必:(1) 复制密钥,(2) 在单独的会话中验证密钥登录有效,(3) 然后再禁用密码认证。

门户 URL 稳定性

印尼政府门户网站经常在未通知的情况下更改其 URL 结构。截至 2026 年 3 月的已知变更:

模块

旧 URL

新 URL

状态

BPOM

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

/all-produk?q={keyword}

✅ 已更新

KPU

/Pemilu/caleg/list

/Pemilu/Peserta_pemilu

✅ 已更新

BMKG

/DataMKG/MEWS/Warning/cuacasignifikan.json

/DataMKG/TEWS/gempadirasakan.json

✅ 已更新

LHKPN

/portal/user/check_search_announ

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 fetch

API 密钥

模块

需要密钥

环境变量

注册

BPS

BPS_API_KEY

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

check_bpomsearch_bpomget_bpom_status

3

bpjph

check_halal_certlookup_halal_by_productget_halal_statuscross_reference_halal_bpom

4

ahu

lookup_company_ahuget_company_directorsverify_company_statussearch_companies_ahu

4

ojk

check_ojk_licensesearch_ojk_institutionsget_ojk_statuscheck_ojk_waspada

4

oss_nib

lookup_nibverify_nibsearch_oss_businesses

3

lpse

lookup_vendor_lpsesearch_lpse_vendorssearch_lpse_tendersget_lpse_portals

4

kpu

get_candidatesearch_kpu_candidatesget_election_results_kpuget_campaign_finance_kpu

4

lhkpn

get_lhkpnsearch_lhkpncompare_lhkpnget_lhkpn_pdf

4

bps

search_bps_datasetsget_bps_indicatorlist_bps_regions

3

bmkg

get_bmkg_alertsget_weather_forecastget_earthquake_historyget_latest_earthquake

4

simbg

lookup_building_permitsearch_permits_by_arealist_simbg_portals

3


AI 代理集成

本仓库将 AI 代理视为一等消费者来构建。

面向 AI 编码代理

文件

用途

代理

AGENTS.md

架构、模式、关键规则、注意事项

所有编码代理

CLAUDE.md

命令、应做/不应做规则、风格指南

Claude Code

.cursorrules

Cursor 的项目规则

Cursor

.github/copilot-instructions.md

Copilot 的说明

GitHub Copilot

CONTRIBUTING.md

模块契约 + PR 清单

全部

SKILL.md

技能发现(AgentSkills 格式)

支持技能的代理

PROMPTS.md

示例提示词 + 交互式工件配方

所有 AI 代理

连接 MCP 工具(任选其一)

选项 A — 自托管远程服务器(自行部署):

在 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"
    }
  }
}

注意: 没有共享的托管服务器。每个用户部署自己的实例,以控制代理设置、速率限制和 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 是否仍然有效" "在 AHU 注册表中搜索名为 'Maju Bersama' 的公司" "印尼最近一次地震是什么?"

更多示例提示词和交互式工件配方,请参阅 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 的所有清真证书"

公司尽职调查 "在 AHU 公司注册表中查找 PT Maju Bersama,并检查其董事是谁" "这家公司是否获得 OJK 许可?同时检查许可证注册表和 waspada(警告)列表"

公共财务 "搜索雅加达官员的 LHKPN 财富申报" "在 LPSE 上查找道路工程的政府采购招标"

灾害与天气 "印尼最近一次地震是什么?" "从 BMKG 获取 DKI Jakarta 的天气预报"

统计 "查找按省份划分的贫困率 BPS 数据集" "获取过去 5 年的通胀指标"

多源查询 "我想验证一家食品公司:检查 AHU 的注册、OJK 的金融许可证、BPOM 的产品注册以及 BPJPH 的清真证书" "比较这两位官员在过去 3 个报告期内的 LHKPN 财富申报"

面向 AI 代理的设计决策

  1. 统一的响应信封 — 每个工具都返回具有相同字段的 CivicStackResponse。代理无需模块特定的解析逻辑。

  2. 错误信封而非异常 — 代理可收到可推理的结构化错误信息,而非堆栈跟踪。

  3. 自文档化工具 — MCP 工具描述包含参数类型、预期值和响应格式。

  4. 确定性命名 — 所有模块均采用 check_<module>search_<module>get_<module>_status 模式。


安全

功能

配置

默认值

API 密钥认证

CIVIC_API_KEY 环境变量

禁用(开放)

速率限制

CIVIC_RATE_LIMIT 环境变量

每个 IP 60 请求/分钟

代理白名单

CIVIC_ALLOWED_PROXIES 环境变量

任何非私有 IP

SSRF 防护

内置

阻止 RFC 1918 + localhost

容器用户

Dockerfile

非 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

开发

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 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

贡献

请参阅 CONTRIBUTING.md。每个模块 PR 必须包含:

  • 返回 CivicStackResponsefetch()search()

  • FastAPI 路由 + FastMCP 服务器

  • 3 个以上 VCR 测试夹具

  • 模块 README

连续 60 天 故障的模块会被标记为 DEGRADED 并归档。


使用方

示例架构

简单:清真产品检查器

一个单页应用,用于检查产品是否获得清真认证。仅需一个模块,印尼用户无需代理。

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),
    }

高级:带 MCP 工具的 AI 代理

一个使用 MCP 工具回答有关印尼公民数据自然语言问题的 AI 助手。该代理会推理应查询哪些门户。

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

相关

许可证

MIT — 请参阅 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