Skip to main content
Glama

DataPulse MY

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

Open in Google Colab: Open In Colab

M8ven Verified mcpgrade

๐Ÿค– AI-agent-ready โ€” Wire DataPulse MY into Claude Desktop, Cursor, Cline, or any MCP-compatible client with one config block. Your agent gets 389 official Malaysian datasets โ€” including 30 GTFS transit feeds (KTMB, Prasarana, BAS.MY) โ€” with declared licences and an honest ten-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

  • AI builders and AI-agent / LLM-app developers wiring a model to the read-only MCP server so it can check a Malaysian figure's freshness, licence, and provenance before it cites the number.

  • AI agents as consumers discovering and querying the catalogue through llms.txt, agent.json, and the read-only MCP endpoint without a browser, receiving the same freshness, licence, schema-drift, and provenance evidence a human reviewer would.

  • University students, academics, and researchers using the Colab notebook to see which Malaysian official series is genuinely current versus reference or stale before grounding coursework, a thesis, or a replication.

  • Data scientists and analysts distinguishing a series that stopped updating (stale/discontinued) from a lookup/reference table that is fine as-is, before building a model or dashboard.

  • Compliance, validation, and regulatory-monitoring teams keeping an evidence/attestation trail (probe timestamp, content date, source, attestation) that an official figure was checked before it appears in a product or external communication.

  • Journalists and fact-checkers verifying a fuel price, inflation/CPI, rate, ridership, or policy figure is current before publishing.

  • Civic technologists building reproducible pipelines on transparent health metadata.

  • Public servants seeing the discoverability and reliability status of the open data their agency publishes.

Related MCP server: Data.gov.my MCP Server

Use this for

  • AI builder / agent developer: give your agent a pre-citation trust check โ€” before it answers from a Malaysian dataset, have it call verify_dataset and get_freshness_summary and caveat anything stale instead of asserting currentness.

  • AI agent consumer: discover and query the catalogue via llms.txt plus the read-only MCP endpoint, and receive freshness status, licence, schema-drift, and provenance as structured context.

  • Student / researcher: ground a coursework or thesis figure in a dataset whose freshness and licence you can actually verify, via the Colab notebook.

  • Data scientist / analyst: before modelling a series, tell one that stopped updating (stale/discontinued) apart from a lookup/reference table that is fine as-is.

  • Compliance / validation team: keep an evidence trail that an official figure was checked at a known time before it appears in your product or external communication.

  • Journalist / fact-checker: before citing a fuel price, inflation/CPI, rate, or ridership figure, check its freshness so you are not publishing a stale number.

  • Civic technologist: consume the machine-readable health envelopes in a reproducible pipeline with transparent health metadata.

  • Public servant: see how discoverable and reliably described your agency's published open data is.

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 reference family splits into plain reference, policy-reference (policy state that stays valid until superseded โ€” BNM OPR is current while unchanged, not stale), and reference-current (a lookup that must still pass freshness, such as a bank-rate table that can itself go stale). 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): 87 fresh ยท 132 aging ยท 152 stale ยท 1 discontinued ยท 1 degraded ยท 5 browser-dependent ยท 11 reference

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.

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 (5-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 5-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. Consumers can also use anomaly_detected as an explainable, orthogonal freshness-delta signal without changing the ten-status taxonomy.

  • 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 ten-status trust taxonomy. Each entry retains its human-readable steward and supplies a stable custodian ID resolved through custodians.json for publisher-level provenance.

Why this matters now. AI agents are increasingly the buyers of structured public data โ€” they retrieve and act on resources at machine speed, and the proportion of traffic that hits the human web from agents is already displacing the old "crawl โ†’ index โ†’ human visits โ†’ ad impression" bargain that funded open publishers. The workloads that survive that shift are the ones that publish clean, attested, licence-clear resources an agent can consume without re-deriving trust from scratch. DataPulse MY is built for that: one self-describing index, one MCP endpoint, ten honest health statuses, and signed probe attestations โ€” so an agent can answer a question about Malaysian public data without first having to verify the data exists, is current, and is licensed for the use it is about to make of it.

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) Verified by mcpgrade: 100/100 (Grade A). The canonical tool count lives in mcp.json / agent.json.

  • 18 tools: search_datasets, get_dataset, find_stale, find_anomalies, find_deteriorating, find_recovering, find_unreliable, find_schema_drift, check_reconciliation, get_provenance, get_evidence, verify_dataset, get_freshness_summary, verify_evidence, trust_verdict, verify_attestation, find_by_licence, usage_summary

The public endpoint serves all 18 read-only tools over the 389-dataset catalogue.

  • 8 resources plus 1 resource template, including datapulse://attestations and the signed daily probe-attestation index.

get_evidence exposes pipeline receipts; verify_evidence performs cached transport-only live checks and does not update health.

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.

Authenticated buyer API

Paying integrations use the separate, versioned /api/v1/ buyer API. It uses X-API-Key authentication, durable per-key request limits, and audit logs; the public MCP endpoint above remains intentionally unauthenticated. See the buyer API reference for endpoint and operator details.

How to consume the data

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 the read-only tools listed above. 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 (federal_finance_qtr_revenue)

Quarterly

data.gov.my Federal Operating Expenditure (federal_finance_qtr_oe)

Quarterly

data.gov.my Money Aggregates (dgm_money_aggregates)

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 (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 Healthcare Staff (healthcare_staff)

Annual

data.gov.my Blood Donations by State (blood_donations_state)

Daily

data.gov.my Infant Immunisation (infant_immunisation)

Annual

data.gov.my Sexually Transmitted Diseases by State (std_state)

Annual

data.gov.my PeKaB40 Screenings by State (pekab40_screenings_state)

Daily

data.gov.my Malaysian National Health Accounts (mnha)

Annual

data.gov.my Electricity Supply (electricity_supply)

Monthly

data.gov.my Water Production (water_production)

Annual

data.gov.my Treated Water Access (water_access)

Annual

data.gov.my KTMB Ridership (dgm_ktmb_ridership_monthly)

Monthly

data.gov.my Cellular Subscribers (cellular_subscribers)

Annual

data.gov.my Prisoners by State and Sex (prisoners_state)

Annual

data.gov.my Drug Addicts by State and Age (drug_addicts_age)

Annual

data.gov.my Female Representation in Local Authorities (local_authority_sex)

Annual

data.gov.my Female Representation in Parliament (parliament_sex)

Annual

data.gov.my Marine Fish Landings (fish_landings)

Monthly

data.gov.my Crops by State (crops_state)

Annual

data.gov.my Schools by District (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.

Verify before trust

Every dataset in this catalogue ships with a publicly-signed Sigstore DSSE evidence receipt that an agent can verify offline, without trusting the DataPulse server. An agent (human or MCP) can obtain, for any dataset, the full health row + evidence + signed-receipt-verification in three MCP tool calls or fewer: search_datasets โ†’ verify_dataset โ†’ get_freshness_summary. The standard offline path is:

cosign verify-blob \
  --bundle https://www.data-pulse.my/data/fuelprice.receipt.sigstore.json \
  --certificate-identity 'https://github.com/r3dz4r/datapulse-my/.github/workflows/deploy-cloudflare-pages.yml@refs/heads/main' \
  --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
  --certificate-github-workflow-repository r3dz4r/datapulse-my \
  --certificate-github-workflow-ref refs/heads/main \
  --certificate-github-workflow-name "Datapulse MY canonical Pages" \
  fuelprice

For the portfolio-level health bundle, verify /signatures/health.latest.sigstore.json with the exact companion manifest at /signatures/datapulse.json. That signed-manifest snapshot is distinct from /datapulse.json, the current discovery manifest: the latter can change when generated metadata is refreshed. A valid signature proves the integrity of DataPulse's attested observation, not that upstream data is semantically true. Every refresh publishes signed bundles to the public Rekor log.

See notes/2026-08-30-phase-5-verify-before-trust-sovereignty-one-pager.md for the full positioning one-pager (sovereignty framing, no-competitor gap, distribution status).

Monitoring

  • The VPS datapulse-health.timer wakes every 5 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, catalog snapshot, and delta 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.

Privacy

See PRIVACY.md for what DataPulse collects (transient operational logs for rate limiting and usage aggregation) and what it does not collect (no credentials, no accounts, no personal data).

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Model Context Protocol (MCP) server that provides weather forecast, warnings, water level associated with flood, and earthquake reports from Malaysia Government's Open API.
    4
    1
    MIT
  • 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
    Connects to Malaysia's OpenDOSM open data API via Pipeworx, enabling access to official statistics through MCP tools or natural language queries.
    8
    MIT

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/r3dz4r/datapulse-my'

If you have feedback or need assistance with the MCP directory API, please join our Discord server