datapulse-my

datapulse-my

Trust layer for 375 Malaysian public datasets. Independent probes every 15 min, 10-status taxonomy, machine-readable licence metadata, read-only MCP. No API key.

Category
访问服务器

README

DataPulse MY

Live dashboard: https://www.data-pulse.my

Open in Google Colab: Open In Colab

🤖 AI-agent-ready — Wire DataPulse MY into Claude Desktop, Cursor, Cline, or any MCP-compatible client with one config block. Your agent gets 375 official Malaysian datasets — including 30 GTFS transit feeds (KTMB, Prasarana, BAS.MY) — with declared licences and an honest nine-status trust taxonomy instead of a blanket green checkmark.

→ Connect your AI agent in 30 seconds

DataPulse MY is an open-source trust layer for Malaysian public data. It makes official datasets easier to assess and reuse by publishing a small manifest, human-readable health reports, and machine-readable health envelopes.

It does not replace the official source. It documents what is available, whether it is fresh, how its schema behaves, and which collection quirks users need to handle.

Who it is for

  • Journalists and researchers checking whether a public dataset is usable.
  • Civic technologists building reproducible data pipelines.
  • Public servants improving the discoverability and reliability of open data.
  • Developers who need stable, machine-readable dataset health metadata.

Use this for

  • Journalist fact-check: before citing a fuel price figure, check fuelprice freshness to make sure it's current.
  • Pipeline health gate: fail the build when a required dataset probe has remained unavailable for more than 24 hours.
  • RAG knowledge base: consume the JSON envelopes as structured context for a chatbot answering "what's the latest BNM rate?"

Dataset health

Health is reported as fresh, aging, stale, discontinued, degraded, browser-dependent, unreachable, unknown, unknown-freshness, or reference. Unknown freshness means the URL and content shape work, but neither a Last-Modified header nor a parseable content date proves when the data was updated. Reference means versioned lookup data is reachable and its record count is measured, while date-based freshness does not apply. The public _trust_summary shows the distribution and explicitly counts missing freshness and row-count signals.

Discontinued — The source has stopped publishing new data. The data is frozen at the last known content date. This is not a freshness failure — it's a publisher decision.

Current distribution (_trust_summary): 95 fresh · 108 aging · 153 stale · 1 discontinued · 5 browser-dependent · 13 reference

<!-- Statuses with zero count are omitted. Full per-dataset health is in health/latest.json and per-dataset badges live in badges/. -->

Subscribe: RSS feed — get notified when dataset health changes.

⚠️ Status: active development. Dashboards and health snapshots update as probes complete. Per-dataset reports under data/{id}.md may briefly lag behind the live health snapshot in health/latest.json (a regeneration gap that is being closed). Coverage and quality improve with each tagged release; expect rough edges. Track progress via the GitHub Releases page — v0.4.0 is the current milestone.

Browser-dependent datasets

Five sources (currently 1.4% of the catalogue) require a real browser to probe because their source pages render client-side JavaScript: eperolehan-diklankan, doe_apims, doe_rqims, doe_mqims, and kkm_idengue.

DataPulse uses Camofox, a self-hosted patched headless-Chromium sidecar, to probe these. The probe path is check.sh → Camofox sidecar → DOM snapshot → content-date extraction.

To enable browser probing:

  1. Run the Camofox Docker sidecar on a reachable address (default http://localhost:9377). The probe script and the GitHub Actions workflow pick this up from the CAMOFOX_BASE_URL environment variable; nothing in this repo encodes a public IP.
  2. Set CAMOFOX_BASE_URL to that address.
  3. Restart the timer with systemctl restart datapulse-health.timer.

Without Camofox, those five datasets will sit at browser-dependent — the honest status: DataPulse cannot probe them without a browser, so it says so rather than failing silently. See scripts/smoke_browser_probes.sh for isolated smoke tests.

Legal

DataPulse probes publicly-published open-data sources. We do not bypass authentication, CAPTCHAs, or terms-of-service restrictions. Every source we probe is publicly available without login; the data is aggregate/non-personal; and the probe respects each dataset's declared refresh frequency.

All scraping is rate-limited (15-minute cadence, dataset-tier cadence applied) and identifies itself via User-Agent. Sources we cannot probe without authentication, CAPTCHA bypass, or ToS violation are marked unreachable or browser-dependent — never silently scraped through a workaround.

If you are a data source maintainer and would like DataPulse to adjust its probe cadence, exclude a dataset, or remove it from the manifest, please open a GitHub issue or contact the maintainers.

AI-agent-ready — what it means for you

Give your organisation's AI tools current, licensed, and verified Malaysian public data without first building a custom integration. DataPulse MY makes the full portfolio discoverable from one self-describing index, ready for agents, RAG systems, and internal knowledge tools to consume.

What being AI-ready gives you

  • Zero integration work: an AI agent or LLM/RAG system fetches one llms.txt and can use the entire portfolio immediately — no scraping, API-key setup, or data-format reverse-engineering.
  • Honest freshness signals: a 15-minute timer probes datasets when their cadence tier is due, separating HTTP reachability, browser dependency, schema validity, and source freshness so missing evidence is visible instead of being labelled healthy.
  • Machine-readable and licence-clear: every dataset has a JSON envelope with its schema, licence, and refresh cadence, giving legal and engineering teams the information they need to approve and integrate it.
  • Trustworthy for AI: verified official sources and explicit licences let agents cite and use the data without permission ambiguity.
  • RAG and knowledge-base ready: drop the envelopes into a retrieval pipeline to ground chatbots and AI tools in current Malaysian public data.

Every manifest dataset declares either CC BY 4.0 or OGL licensing and is assessed with the honest nine-status trust taxonomy.

MCP server (read-only)

DataPulse MY also exposes an AI-ready, read-only MCP server so agents can query the catalogue natively:

  • Endpoint: https://mcp.data-pulse.my/mcp (Streamable HTTP, no auth)
  • 5 tools: search_datasets, get_dataset, find_stale, get_provenance, find_by_licence
  • 3 resources: datapulse://index, datapulse://licences, datapulse://{dataset_id}

The public endpoint is live and serves all 5 read-only tools over the 375-dataset catalogue.

Connect from Claude Desktop:

{
  "mcpServers": {
    "datapulse-my": {
      "transport": "streamable-http",
      "url": "https://mcp.data-pulse.my/mcp"
    }
  }
}

See llms.txt for the full discovery index, and docs/mcp-deploy.md for the deployment architecture.

How to consume the data

Verify access:

curl -s https://r3dz4r.github.io/datapulse-my/llms.txt

To consume the portfolio:

  1. Fetch llms.txt for the curated index.
  2. Fetch datapulse.json for the machine-readable manifest, including licence, refresh cadence, and geographic coverage.
  3. Fetch health/latest.json to check freshness before use.
  4. Cite each dataset according to its licence and attribution requirements.

robots.txt allows all agents; scripts/verify_agent_ready.sh is the agent-consumer self-test.

For humans wiring their own agents: see the MCP server section below for the Claude Desktop / Cursor / Cline config block, or the full integration guide at docs/mcp-deploy.md.

Wire it into Claude Desktop via claude_desktop_config.json (30 seconds, no API key):

{
  "mcpServers": {
    "datapulse-my": {
      "transport": "streamable-http",
      "url": "https://mcp.data-pulse.my/mcp"
    }
  }
}

Restart Claude Desktop, confirm the hammer icon shows "datapulse-my" with 5 tools: search_datasets, get_dataset, find_stale, get_provenance, find_by_licence. Cursor / Cline use the same JSON in their MCP config panel.

Included datasets

Daily reference data

Daily-published reference datasets from official Malaysian sources. Each agency publishes on its own schedule, declared in refresh_frequency; the dashboard combines the date-only source value with the publication time and does not infer a time from midnight or UTC conversion.

Bank Negara Malaysia (BNM)

MET Malaysia

Department of Environment (DOE)

KKM (Ministry of Health)

OpenDOSM (DOSM open data portal)

data.gov.my

GTFS transit feeds

The transport namespace adds 16 GTFS Static schedule ZIPs and 14 GTFS Realtime vehicle-position protobuf feeds for KTMB, Prasarana, and BAS.MY services. Static samples are under samples/gtfs-static/ and realtime snapshots are under samples/gtfs-realtime/.

DataPulse MY currently tracks the portfolio declared in datapulse.json.

Current coverage

Refresh cadence

Dataset Refresh cadence
Malaysian Fuel Prices (fuelprice) Weekly
ePerolehan Tender Notices (eperolehan-diklankan) Hourly
PriceCatcher (pricecatcher) Monthly
BNM Daily Exchange Rates (exchangerates_daily_0900) Daily on weekdays at 0900 MYT
BNM Daily Exchange Rates (exchangerates_daily_1130) Daily on weekdays at 1130 MYT
BNM Daily Exchange Rates (exchangerates_daily_1200) Daily on weekdays at 1200 MYT
BNM Daily Exchange Rates (exchangerates_daily_1700) Daily on weekdays at 1700 MYT
MET Malaysia Weather Forecast (met_weather) Daily
DOE APIMS Air Quality (doe_apims) Hourly
DOE RQIMS River Water Quality (doe_rqims) Hourly
DOE MQIMS Marine Water Quality (doe_mqims) Monthly
KKM iDengue (kkm_idengue) Daily
OpenDOSM Crime by District (dosm_crime_district) Annual
OpenDOSM CPI by State (dosm_cpi_state) Monthly
OpenDOSM GDP by State (dosm_gdp_state_real_supply) Annual
OpenDOSM Quarterly Real GDP (dosm_gdp_qtr_real) Quarterly
OpenDOSM Annual Real GDP by Supply Sector (dosm_gdp_annual_real_supply) Annual
OpenDOSM Trade Headline (dosm_trade_headline) Monthly
OpenDOSM CPI Inflation by Division (dosm_cpi_inflation) Monthly
OpenDOSM Trade by End Use (dosm_trade_enduse_bec) Monthly
OpenDOSM Labour Force Statistics (dosm_lfs_qtr) Quarterly
OpenDOSM Labour Force Statistics by State (dosm_lfs_qtr_state) Quarterly
OpenDOSM Employment by Sector and Sex (dosm_employment_sector) Annual
OpenDOSM Population by State (dosm_population_state) Annual
OpenDOSM Nominal GDP by Supply Sector (dosm_gdp_annual_nominal_supply) Annual
OpenDOSM Quarterly Nominal GDP (dosm_gdp_qtr_nominal) Quarterly
OpenDOSM Seasonally Adjusted Real GDP (dosm_gdp_qtr_real_sa) Quarterly
OpenDOSM Annual Nominal GDP and GNI (dosm_gdp_gni_annual_nominal) Annual
OpenDOSM Core CPI Inflation (dosm_cpi_core_inflation) Monthly
OpenDOSM State CPI Inflation (dosm_cpi_state_inflation) Monthly
OpenDOSM Producer Price Index (dosm_ppi) Monthly
OpenDOSM Annual Labour Force Statistics (dosm_lfs_year) Annual
OpenDOSM Monthly Labour Force Statistics (dosm_lfs_month) Monthly
OpenDOSM Trade by SITC Section (dosm_trade_sitc_1d) Monthly
OpenDOSM Export-Oriented IPI (dosm_ipi_export) Monthly
OpenDOSM Domestic-Oriented IPI (dosm_ipi_domestic) Monthly
data.gov.my Interest Rates (dgm_interest_rates) Monthly
data.gov.my Federal Revenue (dgm_federal_finance_qtr_revenue) Quarterly
data.gov.my Federal Operating Expenditure (dgm_federal_finance_qtr_oe) Quarterly
data.gov.my State Government Expenditure (dgm_state_finance_expenditure) Annual
data.gov.my Money Aggregates (dgm_money_aggregates) Monthly
data.gov.my Currency in Circulation (dgm_currency_in_circulation) Monthly
data.gov.my Payment Systems (dgm_payments_systems) Monthly
data.gov.my Payment Instruments (dgm_payments_instruments) Monthly
data.gov.my Payment Channels (dgm_payments_channels) Monthly
data.gov.my Annual Interest Rates (dgm_interest_rates_annual) Annual
data.gov.my EPF Dividend Rates (dgm_epf_dividend) Annual
data.gov.my Vehicle Registrations by Type and Fuel (dgm_vehicle_registrations_type_fuel) Monthly
data.gov.my FPX Transactions (dgm_payments_transactions_fpx) Daily
OpenDOSM Births by State (dosm_birth_state) Annual
OpenDOSM Deaths by State (dosm_death_state) Annual
OpenDOSM Maternal Deaths by State (dosm_death_maternal_state) Annual
OpenDOSM Marriages by State and Sex (dosm_marriages_state) Annual
data.gov.my Hospital Beds (dgm_hospital_beds) Annual
data.gov.my Healthcare Staff (dgm_healthcare_staff) Annual
data.gov.my Blood Donations by State (dgm_blood_donations_state) Daily
data.gov.my Infant Immunisation (dgm_infant_immunisation) Annual
data.gov.my Sexually Transmitted Diseases by State (dgm_std_state) Annual
data.gov.my PeKaB40 Screenings by State (dgm_pekab40_screenings_state) Daily
data.gov.my Malaysian National Health Accounts (dgm_mnha) Annual
data.gov.my Electricity Consumption (dgm_electricity_consumption) Monthly
data.gov.my Electricity Supply (dgm_electricity_supply) Monthly
data.gov.my Water Consumption (dgm_water_consumption) Annual
data.gov.my Water Production (dgm_water_production) Annual
data.gov.my Treated Water Access (dgm_water_access) Annual
data.gov.my Public Transport Ridership (dgm_ridership_headline) Daily
data.gov.my KTMB Ridership (dgm_ktmb_ridership_monthly) Monthly
data.gov.my Cellular Subscribers (dgm_cellular_subscribers) Annual
data.gov.my Prisoners by State and Sex (dgm_prisoners_state) Annual
data.gov.my Drug Addicts by State and Age (dgm_drug_addicts_age) Annual
data.gov.my Female Representation in Local Authorities (dgm_local_authority_sex) Annual
data.gov.my Female Representation in Parliament (dgm_parliament_sex) Annual
data.gov.my Marine Fish Landings (dgm_fish_landings) Monthly
data.gov.my Crops by State (dgm_crops_state) Annual
data.gov.my Schools by District (dgm_schools_district) Annual
OpenDOSM Household Income, Malaysia (dosm_hh_income) Biennial to triennial (survey years)
OpenDOSM Household Income by State (dosm_hh_income_state) Biennial to triennial (survey years)
OpenDOSM Household Income by District (dosm_hh_income_district) Biennial to triennial (survey years)
OpenDOSM Poverty, Malaysia (dosm_hh_poverty) Biennial to triennial (survey years)
OpenDOSM Poverty by State (dosm_hh_poverty_state) Biennial to triennial (survey years)
OpenDOSM Poverty by District (dosm_hh_poverty_district) Biennial to triennial (survey years)
OpenDOSM Income Inequality, Malaysia (dosm_hh_inequality) Biennial to triennial (survey years)
OpenDOSM Income Inequality by State (dosm_hh_inequality_state) Biennial to triennial (survey years)
OpenDOSM Income Inequality by District (dosm_hh_inequality_district) Biennial to triennial (survey years)
OpenDOSM Household Expenditure by DUN (dosm_hh_expenditure_dun) Biennial to triennial (survey years)
OpenDOSM Household Expenditure by Parliament (dosm_hh_expenditure_parlimen) Biennial to triennial (survey years)
OpenDOSM Population, Malaysia (dosm_population_malaysia) Annual
OpenDOSM Population by Parliament (dosm_population_parlimen) Annual
OpenDOSM Deaths by District and Sex (dosm_death_district_sex) Annual
OpenDOSM Marriages by State, Age, and Sex (dosm_marriages_state_age) Annual
OpenDOSM Fertility (dosm_fertility) Annual
OpenDOSM Maternal Deaths, Malaysia (dosm_death_maternal) Annual

How to use it

Start with datapulse.json to discover datasets and their official sources. Follow each health_report link for a plain-language assessment, or consume the matching file under data/json/ in an automated workflow.

For example, a data pipeline can inspect status, content_freshness_date, and freshness_signal_source before processing a source, while a researcher can review the known quirks before designing a collection method.

Monitoring

  • The VPS datapulse-health.timer wakes every 15 minutes and runs only the datasets whose cadence tier is due.
  • GitHub Actions performs a full weekly probe as a fallback and republishes the generated health, badge, feed, README, and changelog artifacts.
  • RSS feed — available.
  • Status badges — available.
  • More datasets — planned.

Adopt a dataset

Know a Malaysian public dataset that deserves dependable health metadata? Adopt it: verify its source and licence, document its schema and quirks, and submit a health report. See CONTRIBUTING.md for the expected three-file contribution model.

New contributors can start with the repository's Good first issues or propose a dataset through the GitHub issue forms. Maintainers use good first issue (yellow), adopt-a-dataset (blue), freshness-check (blue), bug (red), documentation (blue), question (purple), and wontfix (gray) to route contributions.

Licence

DataPulse MY is released under the MIT License. Source datasets remain subject to the licences and attribution requirements stated in their individual health reports.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选