Indonesia Civic Stack

io.github.suryast由 GitHub 帳號 suryast 發布v0.1.1更新於 Oct 27, 2026

40 MCP tools for 11 Indonesian government portals — BPOM, BPJPH, AHU, OJK, BMKG+

發布方自己的服務:Nexus

概覽

AI 產生的概覽

本機 MCP 伺服器,提供約 45 個工具,用來查詢印尼政府入口網站的產品、清真認證、企業、金融、選舉、統計與氣象資料。

可以做什麼
  • 查詢產品註冊(BPOM)與清真認證(BPJPH),並可交叉比對兩者
  • 查詢企業登記、董事與狀態(AHU)、營業識別號(OSS NIB)及建築許可(SIMBG)
  • 檢索 OJK 機構與警示名單、LPSE 供應商與招標、KSEI 證券頁面
  • 取得選舉候選人、2024 年選舉結果與競選經費(KPU),以及官員財產申報(LHKPN)
  • 取得 BPS 統計資料與地區、BMKG 地震與天氣、法規(JDIH)及預算主題(DJPB)
適用情境
適合公民科技、盡職調查或研究工作需要印尼公部門紀錄時使用,例如核實產品與清真認證、查企業或供應商、取得官方統計、選舉與災害資料,並由使用者本機的助理呼叫。
執行需求
以 Python 套件形式在本機執行,需安裝 mcp 附加元件;依賴瀏覽器的模組(AHU、OSS NIB、JDIH、LHKPN 搜尋、OJK 完整清單)另需 Playwright 與 Camoufox 二進位檔。統計工具需要 BPS_API_KEY。在印尼境外存取入口網站可能需要 PROXY_URL。不提供託管伺服器。
安裝前請注意
資料來自擷取,可能過期或失效:ERROR 或空結果不能證明紀錄不存在,查到註冊也不構成安全或法律保證。設定代理的營運方可控制伺服器收到的回應。內附 REST 應用沒有 API 金鑰驗證或流量限制,應只綁定本機回環位址。可選的掃描 PDF 備援會把文件送往外部 API,可能產生費用。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Indonesia Civic Stack,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

🇮🇩 indonesia-civic-stack

[PyPI] [MCP Registry] [CI] [Python] [License]

Python SDK, MCP tools, and REST wrappers for Indonesian public-sector data. Release 1.2.1 includes 14 scraper modules, 45 unified MCP tools, and 11 REST module routers. These counts describe code, not live availability.

Indonesian public-data portals expose different APIs, HTML structures, browser requirements, and access restrictions. This project provides a shared response schema and reusable clients rather than requiring every civic-tech app to build its own integration. Portal changes can still break individual operations; verify the response and its provenance before drawing conclusions.

Module inventory and maturity

Each row has a scraper, normalizer, and module test file. “Tests present” means mocked/replayed tests exist, not that they establish current portal liveness. The MCP column counts decorators in the unified civic_stack/server.py.

ModuleSource configured in codeData / methodMCP toolsRESTTests present
bpomcekbpom.pom.go.idProduct registration; HTTP HTML3YesYes
bpjphcmsbl.halal.go.idHalal certificates; HTTP REST4YesYes
ahuahu.go.idCompany registry; browser helper4YesYes
ojkwww.ojk.go.id / sikapiuangmu.ojk.go.idInstitutions and alerts; HTTP + optional browser list4YesYes
oss_niboss.go.idNIB identity; Playwright3YesYes
lpsespse.inaproc.id and configured portalsVendors/tenders; multi-portal HTTP4YesYes
kpuinfopemilu.kpu.go.id / sirekap-obj-data.kpu.go.idCandidates and 2024 elections; HTTP JSON4YesYes
lhkpnelhkpn.kpk.go.idWealth declarations; Playwright search, HTTP PDFs3YesYes
bpswebapi.bps.go.idStatistics; HTTP API, requires BPS_API_KEY3YesYes
bmkgdata.bmkg.go.idEarthquakes/weather; HTTP JSON/XML4YesYes
simbgsimbg.pu.go.id and pilot portalsPermits; multi-portal HTTP3YesYes
jdihperaturan.go.idRegulations; Playwright recent-list filtering2NoYes
kseiweb.ksei.co.idSecurities and statistics links; HTTP HTML2NoYes
djpbdata-apbn.kemenkeu.go.idBudget themes; HTTP JSON2NoYes

JDIH, KSEI, and DJPB are available through the SDK and unified MCP server, but have no individual MCP server or REST router. JDIH search checks up to 50 recent listing links; KSEI securities fetch/search only inspect page 1. Neither is a complete registry search. LHKPN's browser search implementation does not prove that reCAPTCHA or the upstream portal works in your deployment.

Current portal liveness is unverified here. Historical March/April 2026 observations in endpoint status and geo-restrictions are troubleshooting context, not present-day health evidence. An HTTP 200 homepage, local /health, or passing mock/VCR test is not a successful live registry lookup.

Install

bash
pip install indonesia-civic-stack             # Core HTTP SDKpip install "indonesia-civic-stack[mcp]"       # + unified MCP serverpip install "indonesia-civic-stack[api]"       # + FastAPI and uvicornpip install "indonesia-civic-stack[browser]"   # + Playwright and Camoufoxpip install "indonesia-civic-stack[all]"       # mcp + api + browser

Browser-backed operations also need binaries:

bash
playwright install chromiumpython -m camoufox fetch  # AHU Camoufox path

AHU, OSS NIB, JDIH, LHKPN search, and OJK's full-list helper use browser paths. BPJPH's current scraper uses HTTP REST. all does not download browser binaries or include LHKPN's optional PDF packages. Install pdfplumber directly for PDF text extraction; the optional scanned-document fallback needs anthropic and ANTHROPIC_API_KEY, sends the document to an external API, and may incur cost. There are no pdf or playwright extras. SOCKS HTTP transport additionally requires pip install "httpx[socks]".

Python SDK

python
import asynciofrom civic_stack.bpom.scraper import search
async def main():    try:        async with asyncio.timeout(120):            records = await search("paracetamol")    except Exception as exc:        print("Could not verify:", type(exc).__name__)        return    if not records:        print("No records returned; acquisition may be unverified")    for record in records:        print(record.status, record.found, record.source_url, record.fetched_at)        if record.status == "ERROR":            print("Could not verify:", record.result)        elif record.found:            print(record.result)  # Check identity, period, and domain-specific status        else:            print("No match reported within the query scope; not proof of absence")
asyncio.run(main())

Every scraper has fetch() and search(), with module-specific signatures. Specialized helpers include BMKG's get_latest_earthquake, KPU's get_election_results, OJK's check_waspada, KSEI's get_statistics_links, and DJPB's get_budget_summary. See usage and limitations for actual return shapes, scope limits, and unified-tool wrapper caveats.

Response interpretation

Core lookups return CivicStackResponse or lists of envelopes:

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

This is illustrative, not a live response. Status values are ACTIVE, EXPIRED, SUSPENDED, REVOKED, NOT_FOUND, and ERROR. Error details are under result.detail, not a top-level detail. Some helpers return raw lists/dicts, PDF extraction data, or URLs instead of envelopes; status shortcut MCP tools omit source and timestamp. Do not assume every tool has the full schema.

Check status, found, source_url, and fetched_at before reading result. Retrieval time is not publication time; verify the source's reporting period. ERROR is not NOT_FOUND. Current paths in several modules also collapse network/browser failures into NOT_FOUND or []. Consequently, an empty or not-found result alone cannot prove acquisition succeeded or that the record does not exist. BPS fetch() can raise for a missing key; other callers can also encounter unexpected exceptions. Catch exceptions at the caller boundary.

A found registration is not a general safety/legal guarantee. An alert-list match is a warning, not an endorsement. Partial multi-portal results and scraper confidence values must not be presented as exhaustive or authoritative checks.

Unified MCP server

bash
civic-stack-mcp                   # stdio, 45 toolspython -m civic_stack.server      # packaged equivalentcivic-stack mcp                   # CLI stdio entry pointpython -m civic_stack.server --transport http --host 127.0.0.1 --port 8000
# Individual module server (where present):python -m civic_stack.bpom.server

For local clients, configure civic-stack-mcp as the command. The repository's .mcp.json uses .venv/bin/python -m civic_stack.server; create that virtual environment and install [mcp] before discovery. Discovery does not install dependencies or ensure portals respond. There is no shared hosted server.

Unified MCP tool inventory

ModuleRegistered tool names
bpomcheck_bpom, search_bpom, get_bpom_status
bpjphcheck_halal_cert, lookup_halal_by_product, get_halal_status, cross_reference_halal_bpom
ahulookup_company_ahu, get_company_directors, verify_company_status, search_companies_ahu
ojkcheck_ojk_license, search_ojk_institutions, get_ojk_status, check_ojk_waspada
oss_niblookup_nib, verify_nib, search_oss_businesses
lpselookup_vendor_lpse, search_lpse_vendors, search_lpse_tenders, get_lpse_portals
kpuget_candidate, search_kpu_candidates, get_election_results_kpu, get_campaign_finance_kpu
lhkpnget_lhkpn, search_lhkpn, get_lhkpn_pdf
bpssearch_bps_datasets, get_bps_indicator, list_bps_regions
bmkgget_bmkg_alerts, get_weather_forecast, get_earthquake_history, get_latest_earthquake
simbglookup_building_permit, search_permits_by_area, list_simbg_portals
jdihsearch_jdih, get_jdih
kseisearch_ksei, get_ksei
djpbsearch_djpb, get_djpb

These are 45 registered names, not 45 independently validated operations. Some wrappers call generic scraper functions rather than the specialized helper suggested by the tool name; read wrapper caveats before using election-results, campaign-finance, tender, alert-list, or portal-list tools.

Verify registration offline, without calling tools:

bash
python -c 'import asyncio; from civic_stack.server import mcp; print(len(asyncio.run(mcp.list_tools())))'

REST API

bash
civic-stack api --host 127.0.0.1 --port 8000uvicorn civic_stack.app:app --host 127.0.0.1 --port 8000uvicorn civic_stack.bpom.app:app --host 127.0.0.1 --port 8001

The unified app mounts 11 routers. JDIH, KSEI, and DJPB have no REST routes. Open /docs or /openapi.json for the actual route signatures. Examples:

text
GET /bpom/search?q=paracetamolGET /bpjph/search?q=kopiGET /ahu/search?q=ContohGET /ojk/check/Bank%20BCAGET /kpu/search?q=ContohGET /lhkpn/search?q=ContohGET /bps/search?q=inflasiGET /bmkg/forecast/JakartaGET /bmkg/earthquake/latestGET /simbg/search?q=Jakarta

/health only describes the local app; it does not probe upstream portals.

Deployment and security

civic_client() reads PROXY_URL, with environment-based PROXY_MODE=connect or rewrite selection. A *.workers.dev URL auto-selects rewriting. Browser proxy handling is separate: a Worker rewrite URL is not a standard Chromium proxy, AHU and OSS-NIB fall back to PROXY_URL only in CONNECT mode, JDIH uses its explicit proxy argument, and LHKPN search does not forward its proxy_url argument to its browser. Do not assume setting an environment variable proxies every operation. See usage.

Whoever runs a proxy controls the portal responses the server receives. The REST routers and the standalone AHU/OSS-NIB MCP servers therefore accept a caller-supplied proxy_url only when it exactly matches PROXY_URL or an entry in CIVIC_ALLOWED_PROXIES (comma-separated full proxy URLs); anything else is rejected (HTTP 400 or an ERROR envelope). Configure proxies server-side.

Access can vary by deployment, endpoint, and time. Historical regional tests do not establish a current geo-block or WAF cause. Stop after bounded attempts; do not bypass authenticated tiers or repeatedly retry access controls.

The current unified REST app does not implement API-key authentication or per-client rate-limit middleware. Setting CIVIC_API_KEY or CIVIC_RATE_LIMIT alone does not enable either. CIVIC_ALLOWED_PROXIES only gates caller-supplied proxies; it is not an SSRF allowlist for SDK calls. Deploy behind your own authentication, quotas, and network controls. Bind loopback for local use. Module acquisition rate limiters are not public-API abuse controls.

Agent Skills installation

SKILL.md is the portable skill entry point. Its metadata version is "1.2.1"; it uses trigger phrases in description, not unsupported frontmatter keys. Installation must retain the complete repository, especially references/usage.md and the other bundled references, package code, manifest, and licenses. The installed directory must be named indonesia-civic-stack.

For a host that supports a user-selected skills directory:

bash
# Set this to your host's configured directory; destination must not already exist.git clone https://github.com/suryast/indonesia-civic-stack.git "$SKILLS_DIR/indonesia-civic-stack"cd "$SKILLS_DIR/indonesia-civic-stack"pip install -e ".[mcp]"  # if running the bundled MCP code

Do not install only SKILL.md, and do not rename the package to a release worktree's suffix. Host discovery and Python installation are separate steps. For version-pinned installs, choose the reviewed release revision explicitly; cloning the default branch is not a version pin.

Development and offline verification

bash
git clone https://github.com/suryast/indonesia-civic-stack.gitcd indonesia-civic-stackpython -m venv .venv && source .venv/bin/activatepip install -e ".[all,dev]"
pytest --collect-only -q   # derive current collected tests; no fixed advertised totalpytest -v                 # mocked/VCR replay; no live portal calls intendedpytest tests/jdih/ tests/ksei/ tests/djpb/ -vruff check civic_stack/ tests/ scripts/ examples/ app.py server.pyruff format --check civic_stack/ tests/ scripts/ examples/ app.py server.pymypy civic_stack/

All 14 modules have test files, including JDIH, KSEI, and DJPB. A passing offline suite validates fixtures/mocks, not upstream operation. Do not record live cassettes in CI; review the actual test isolation and recording settings first.

Read AGENTS.md, CLAUDE.md, and CONTRIBUTING.md before development. The contribution guide states the desired full module contract; the implemented surfaces above take precedence over older blanket inventory statements in other documents.

References and related projects

License

The root skill/documentation license is MIT; see LICENSE. Module licensing varies; retain module license files and consult LICENSES.md (its older modules/ labels refer to the current civic_stack/ package directories).

來源:README.md,提交 727127b

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.1.1最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

其他 Civic 整合