indonesia-civic-stack
🇮🇩 indonesia-civic-stack
用于印尼政府数据源的生产级抓取器、规范化器和 API 封装。
它是 halalkah.id、legalkah.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模块状态
模块 | 数据源 | 数据 | 代理 | 状态 |
cekbpom.pom.go.id | 食品、药品、化妆品注册 | 🌐 | ✅ 正常 | |
cmsbl.halal.go.id | 清真认证(1.98M+ 条记录) | 🌐 | ✅ 正常 —— 已迁移至 REST API(v1.0.0) | |
ahu.go.id | 公司注册 —— PT、CV、Yayasan、Koperasi | 🇮🇩 | ⚠️ 页面已重构 —— 搜索输入框已变更(2026 年 4 月) | |
持牌金融机构 + Waspada 名单 | 🇮🇩 | ⚠️ 门户已迁移至 SharePoint(2026 年 4 月)—— 抓取器需重写 | ||
oss.go.id | 企业身份(NIB) | 🇮🇩 | ⚠️ 页面已重构 —— Playwright 找不到输入框(2026 年 4 月) | |
spse.inaproc.id | 政府采购 | 🇮🇩 | ✅ 正常 —— 取消弃用(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 | 财产申报(官员) | — | ✅ 正常 —— 通过 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]" # 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 服务器(面向 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 belowMCP 服务器类支持两种初始化方式:
# 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.mdshared/ 层提供:
schema.py——CivicStackResponsePydantic 模型、状态枚举、辅助构造函数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 服务器无需任何代码更改。
代理模式
模式 |
| 工作原理 |
|
| 通过 httpx 传输层使用标准 HTTP/SOCKS CONNECT 代理 |
|
| 将 URL 重写为 |
| (未设置) | 直接连接 |
使用 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 |
|
| ✅ 已更新 |
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 | 是 |
| |
其他所有模块 | 否 | — | — |
如果没有 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 是否仍然有效" "在 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 代理的设计决策
统一的响应信封 — 每个工具都返回具有相同字段的
CivicStackResponse。代理无需模块特定的解析逻辑。错误信封而非异常 — 代理可收到可推理的结构化错误信息,而非堆栈跟踪。
自文档化工具 — MCP 工具描述包含参数类型、预期值和响应格式。
确定性命名 — 所有模块均采用
check_<module>、search_<module>、get_<module>_status模式。
安全
功能 | 配置 | 默认值 |
API 密钥认证 |
| 禁用(开放) |
速率限制 |
| 每个 IP 60 请求/分钟 |
代理白名单 |
| 任何非私有 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 必须包含:
返回
CivicStackResponse的fetch()和search()FastAPI 路由 + FastMCP 服务器
3 个以上 VCR 测试夹具
模块 README
连续 60 天 故障的模块会被标记为 DEGRADED 并归档。
使用方
halalkah.id — 清真产品验证(957 万种产品)
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),
}高级:带 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相关
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