datapulse-my
This server is a read-only MCP endpoint for discovering, inspecting, and verifying Malaysian public datasets and their freshness, licence, provenance, and trust evidence.
Search datasets by natural-language query, source, or licence (
search_datasets,find_by_licence)Get detailed health/freshness info for a dataset, including status, last-verified time, content freshness date, and freshness signal source (
get_dataset,get_freshness_summary)Find risky or problematic datasets: stale/aging/degraded, anomalies, deteriorating or recovering trends, unreliable publishers, and schema/content drift (
find_stale,find_anomalies,find_deteriorating,find_recovering,find_unreliable,find_schema_drift)Check cross-source reconciliation groups and citation-ready provenance evidence (
check_reconciliation,get_provenance)Deep-audit published evidence receipts and re-verify transport-level live checks without updating health artifacts (
get_evidence,verify_evidence)Verify datasets and signed attestations (Ed25519/Sigstore), aggregate trust scores, and return trust verdicts (
verify_dataset,verify_attestation,trust_verdict)Summarize buyer usage from the audit ledger across a date range, with per-tool, per-dataset, and trust-distribution stats (
usage_summary)
DataPulse
Live dashboard: https://www.data-pulse.my
Open in Google Colab:
๐ค AI-agent-ready โ Wire DataPulse into Claude Desktop, Cursor, Cline, or any MCP-compatible client with one config block. Your agent gets
418 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.
This is DataPulse
When an AI quote is wrong, it is often wrong because the underlying data was stale, mis-licensed, or unverifiable โ not because the model hallucinated. An official-looking page does not tell an agent when the dataset behind it last updated, who published it, whether it may legally be reused, or whether the observation can be reproduced by a second party.
DataPulse exists to make that uncertainty explicit. It is an open, read-only verification layer for Malaysian public data: it continuously probes
and publishes โ for each one โ machine-readable evidence about whether the source is reachable, how fresh the content is, what licence applies, how the schema behaves, and when the observation was signed.
It does not replace the official source. It documents, on an honest and reproducible basis, what the official portal states and whether that material is current, so you know what you are reusing or citing. The verification speaks for itself: every claim here is a live, checkable artefact, not a promise.
Related MCP server: Data.gov.my MCP Server
What we do, simply
We watch the sources. A scheduled probe revisits each dataset under its declared cadence and records what it actually finds โ reachability, an honest freshness signal, schema shape, record counts, and collection quirks.
We state the truth plainly. Instead of a blanket green checkmark, each dataset carries one of ten honest health statuses (
fresh,aging,stale,discontinued,degraded,browser-dependent,unreachable,unknown,unknown-freshness,reference). A dataset that cannot be proven fresh is labelledunknown-freshnessโ not silently treated as healthy.We publish evidence, not just claims. Each dated observation is signed and recorded to an immutable public log, so you can verify when DataPulse observed the source and that the record has not been altered.
We make it machine-readable first. The whole portfolio is discoverable from one index and queryable over a read-only MCP server, so an agent receives the same freshness, licence, and provenance signal a careful human reviewer would.
Who this serves
AI builders and agent developers, who want a model to check a Malaysian figure's freshness and licence before it cites the number โ without building a bespoke integration or trusting a scraping pipeline.
Researchers, analysts, and journalists, who need to ground coursework, a thesis, a dashboard, or a published figure in data whose currency and licence they can actually verify.
Compliance and regulatory-monitoring teams, who must keep a tamper-evident trail that an official figure was checked at a known time before it reached a product or a public statement.
Civic technologists and public servants, who want a transparent, reproducible view of how discoverable and reliably described public data is.
Why you can trust the verification
Three independent, checkable layers. You do not have to take DataPulse's word โ you can verify each with the published public key, the public Git source record, and the public transparency log:
Layer | What it proves | How to check it yourself |
Signed envelope | Each per-dataset observation is Ed25519-signed over its exact content by a key in the published registry |
|
Source of record | The served observation byte-matches the versioned Git source |
|
Temporal witness | The health statement carries a Rekor/Sigstore public-log inclusion proof |
|
Run it yourself, from anywhere, with no checkout and no DataPulse code:
curl -fsSLO https://raw.githubusercontent.com/r3dz4r/datapulse-my/main/scripts/verify_external.py
python3 verify_external.pySee Verify DataPulse externally for the full guide, and our methodology below for how health is judged.
A verification layer is only as honest as its method, so DataPulse deliberately tells you when it cannot be sure โ a source that cannot be proven current is labelled accordingly, never silently marked healthy. That is the boundary we hold: the platform proves the integrity and timing of its observations, not that an upstream government figure is semantically true. That distinction is the whole point of an evidence layer, and we do not blur it.
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. Within the catalogue,
data_type refines the reference family without changing the status: policy-reference
rows (policy state that stays valid until superseded โ BNM OPR is current while
unchanged, not stale) and reference-current rows (lookups that must still pass
freshness, such as a bank-rate table that can itself go stale) are judged by their
declared policy, while plain reference rows are static. 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): 90 fresh ยท 113 aging ยท 187 stale ยท 1 discontinued ยท 1 degraded ยท 5 browser-dependent ยท 7 unknown-freshness ยท 14 reference
Subscribe: RSS feed โ get notified when dataset health changes.
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:
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 theCAMOFOX_BASE_URLenvironment variable; nothing in this repo encodes a public IP.Set
CAMOFOX_BASE_URLto that address.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.
Methodology
Topic | DataPulse's position |
Health status | Ten-status taxonomy, judged by reachability + an honest freshness signal ( |
Licence | Every dataset declares its licence machine-readably. Creative Commons Attribution 4.0 (285); MBPP Government Open Data Terms (attribution required) (1); MIT License (8); Open Government Licence (Malaysia) (115); Publisher licence not stated; portal disclaimer applies (4); Singapore Open Data Licence v1.0 (attribution required) (5). A second party can reproduce this from |
Freshness cadence | Each dataset is probed on its own tiered schedule (5-minute timer, cadence-aware) โ |
Provenance | Stable |
Observed claim | The platform proves what an official source was observed to be at a known time โ it does not claim upstream data is semantically true |
Read-only + lawful | Publicly available, authenticated sources only โ never bypassed; rate-limited; identifies itself to sources |
Verification | Fresh days are Rekor-witnessed; signed envelopes + Git source-of-record + public-log inclusion, checkable by anyone |
Connect an AI agent
DataPulse exposes an AI-ready, read-only MCP server so agents can query the catalogue natively. It provides the same freshness, licence, schema-drift, and provenance evidence available to a human reviewer.
Endpoint:
https://mcp.data-pulse.my/mcp(Streamable HTTP, no auth) Graded by mcpgrade โ replay withbash scripts/audit_mcpgrade.sh(pinned version, writesartifacts/mcpgrade/). The canonical tool count lives inmcp.json/agent.json.
19 tools:
search_datasets,get_dataset,get_data_passport,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 19 read-only tools over the 418-dataset catalogue.
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.
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
Dataset inventory is grouped by stable custodian publisher ID; unknown IDs fall back to the ID itself.
National Anti-Drugs Agency (aadk)
data.gov.my Drug Addicts by State & Age Group (
drug_addicts_age) ยท sampleDrug Addicts by State & Drug Type (
drug_addicts_drugtype)Drug Addicts by Highest Education Level (
drug_addicts_education)Drug Addicts by State & Occupation (
drug_addicts_occupation)
Accountant General's Department of Malaysia (agc)
Quarterly Federal Government Finance (
federal_finance_qtr)data.gov.my Quarterly Federal Operating Expenditure (
federal_finance_qtr_oe) ยท sampledata.gov.my Quarterly Federal Government Revenue (
federal_finance_qtr_revenue) ยท sampleAnnual Federal Government Finance (
federal_finance_year)Annual Federal Government Development Expenditure by Function (
federal_finance_year_de)Annual Federal Government Operating Expenditure by Object (
federal_finance_year_oe)Lookup Table: Federal Finance (
lookup_federal_finance)
Agensi Pengangkutan Awam Darat (APAD) (apad)
GTFS Realtime โ BAS.MY Alor Setar Vehicle Positions (
gtfs_realtime_mybas_alor_setar)GTFS Realtime โ BAS.MY Ipoh Vehicle Positions (
gtfs_realtime_mybas_ipoh)GTFS Realtime โ BAS.MY Johor Vehicle Positions (
gtfs_realtime_mybas_johor)GTFS Realtime โ BAS.MY Kangar Vehicle Positions (
gtfs_realtime_mybas_kangar)GTFS Realtime โ BAS.MY Kota Bharu Vehicle Positions (
gtfs_realtime_mybas_kota_bharu)GTFS Realtime โ BAS.MY Kuala Terengganu Vehicle Positions (
gtfs_realtime_mybas_kuala_terengganu)GTFS Realtime โ BAS.MY Kuching Vehicle Positions (
gtfs_realtime_mybas_kuching)GTFS Realtime โ BAS.MY Melaka Vehicle Positions (
gtfs_realtime_mybas_melaka)GTFS Realtime โ BAS.MY Seremban A Vehicle Positions (
gtfs_realtime_mybas_seremban_a)GTFS Realtime โ BAS.MY Seremban B Vehicle Positions (
gtfs_realtime_mybas_seremban_b)GTFS Static โ BAS.MY Alor Setar Bus Schedule (
gtfs_static_mybas_alor_setar)GTFS Static โ BAS.MY Ipoh Bus Schedule (
gtfs_static_mybas_ipoh)GTFS Static โ BAS.MY Johor Bus Schedule (
gtfs_static_mybas_johor)GTFS Static โ BAS.MY Kangar Bus Schedule (
gtfs_static_mybas_kangar)GTFS Static โ BAS.MY Kota Bharu Bus Schedule (
gtfs_static_mybas_kota_bharu)GTFS Static โ BAS.MY Kuala Terengganu Bus Schedule (
gtfs_static_mybas_kuala_terengganu)GTFS Static โ BAS.MY Kuching Bus Schedule (
gtfs_static_mybas_kuching)GTFS Static โ BAS.MY Melaka Bus Schedule (
gtfs_static_mybas_melaka)GTFS Static โ BAS.MY Seremban A Bus Schedule (
gtfs_static_mybas_seremban_a)GTFS Static โ BAS.MY Seremban B Bus Schedule (
gtfs_static_mybas_seremban_b)
Bank Negara Malaysia (bnm)
Base Rates / BLR / Effective LR (
bnm_base_rate)Interbank Swap (
bnm_interbank_swap)Interest Rates: Banking Institutions (
bnm_interest_rate)Interest Volume: Banking Institutions (
bnm_interest_volume)Kijang Emas (Gold Reference Price) (
bnm_kijang_emas)Kuala Lumpur USD/MYR Reference Rate (
bnm_kl_usd_myr)Malaysia Overnight Rate (MYOR) (
bnm_myor)Overnight Policy Rate (OPR) (
bnm_opr)Monthly Currency in Circulation (
currency_in_circulation)Annual Currency in Circulation (
currency_in_circulation_annual)data.gov.my Monthly Interest Rates (
dgm_interest_rates) ยท sampledata.gov.my Annual Interest Rates (
dgm_interest_rates_annual) ยท sampledata.gov.my Monthly Money Aggregates (
dgm_money_aggregates) ยท sampledata.gov.my Monthly Payment Channels (
dgm_payments_channels) ยท sampledata.gov.my Monthly Payment Instruments (
dgm_payments_instruments) ยท sampledata.gov.my Monthly Payment Systems (
dgm_payments_systems) ยท sampledata.gov.my Daily FPX Transactions (
dgm_payments_transactions_fpx) ยท sampleMonthly Exchange Rates (
exchangerates)BNM Daily Exchange Rates (0900) (
exchangerates_daily_0900) ยท sampleBNM Daily Exchange Rates (1130) (
exchangerates_daily_1130) ยท sampleBNM Daily Exchange Rates (1200) (
exchangerates_daily_1200) ยท sampleBNM Daily Exchange Rates (1700) (
exchangerates_daily_1700) ยท sampleMonthly Interest Rates (
interestrates)Annual Interest Rates (
interestrates_annual)Lookup Table: Money & Banking (
lookup_money_banking)Monthly Monetary Aggregates (
monetary_aggregates)Monthly Payment Channels (
payment_channels)Monthly Payment Instruments (
payment_instruments)Monthly Payment Systems (
payment_systems)
Department of Agriculture Malaysia (doa)
data.gov.my Crop Area and Production by State (
crops_state) ยท sampleCrop Area by District (
dosm_crops_district_area)Crop Production by District (
dosm_crops_district_production)
Department of Environment Malaysia (doe)
Air Pollutant Concentrations (
air_pollution)DOE APIMS Air Quality (Hourly API) (
doe_apims) ยท sampleDOE MQIMS Marine Water Quality (Manual) (
doe_mqims) ยท sampleDOE RQIMS River Water Quality (Continuous) (
doe_rqims) ยท sampleRiver Basin Pollution Monitoring (
water_pollution_basin)
Department of Fisheries Malaysia (dof)
data.gov.my Monthly Landings of Marine Fish by State (
fish_landings) ยท sample
Department of Statistics Malaysia (dosm)
Balance of Payments by Account (
bop_balance)Monthly CPI by Group (
cpi_3d)Monthly CPI by Class (
cpi_4d)Monthly CPI by Subclass (
cpi_5d)Monthly Core Consumer Price Index (
cpi_core)Monthly Core CPI Inflation (
cpi_core_inflation)Monthly CPI by Division (2-digit) (
cpi_headline)Monthly CPI by State & Division (2-digit) (
cpi_state)Monthly CPI Inflation by State & Division (2-digit) (
cpi_state_inflation)DOSM's Advance Release Calendar (
dosm_arc_dosm)Broad Economic Categories (BEC) (
dosm_bec)OpenDOSM Annual Births by State (
dosm_birth_state) ยท sampleAnnual CPI by Division (2-digit) (
dosm_cpi_annual)Annual CPI Inflation by Division (2-digit) (
dosm_cpi_annual_inflation)OpenDOSM Monthly Core CPI Inflation by Division (
dosm_cpi_core_inflation) ยท sampleMonthly CPI Inflation by Division (2-digit) (
dosm_cpi_headline_inflation)OpenDOSM Monthly CPI Inflation by Division (
dosm_cpi_inflation) ยท sampleMonthly CPI for Low-Income Households (
dosm_cpi_lowincome)OpenDOSM Monthly CPI by State & Division (
dosm_cpi_state) ยท sampleOpenDOSM Monthly CPI Inflation by State and Division (
dosm_cpi_state_inflation) ยท sampleMonthly CPI by Strata & Division (2-digit) (
dosm_cpi_strata)OpenDOSM Crime by District & Type (Annual) (
dosm_crime_district) ยท sampleOpenDOSM Annual Deaths by District and Sex (
dosm_death_district_sex) ยท sampleOpenDOSM Annual Maternal Deaths, Malaysia (
dosm_death_maternal) ยท sampleOpenDOSM Annual Maternal Deaths by State (
dosm_death_maternal_state) ยท sampleOpenDOSM Annual Deaths by State (
dosm_death_state) ยท sampleOpenDOSM Annual Employment by Sector and Sex (
dosm_employment_sector) ยท sampleOpenDOSM Annual Fertility (
dosm_fertility) ยท sampleTFR and ASFR by State (
dosm_fertility_state)Annual Nominal GDP by Expenditure Type (
dosm_gdp_annual_nominal_demand)Annual Nominal GDP by Expenditure Subtype (
dosm_gdp_annual_nominal_demand_granular)Annual Nominal GDP by Income Component (
dosm_gdp_annual_nominal_income)OpenDOSM Annual Nominal GDP by Supply Sector (
dosm_gdp_annual_nominal_supply) ยท sampleAnnual Nominal GDP by Economic Subsector (
dosm_gdp_annual_nominal_supply_granular)Annual Real GDP by Expenditure Type (
dosm_gdp_annual_real_demand)Annual Real GDP by Expenditure Subtype (
dosm_gdp_annual_real_demand_granular)OpenDOSM Annual Real GDP by Supply Sector (
dosm_gdp_annual_real_supply) ยท sampleAnnual Real GDP by Economic Subsector (
dosm_gdp_annual_real_supply_granular)Annual Real GDP by District & Economic Sector (
dosm_gdp_district_real_supply)OpenDOSM Annual Nominal GDP and GNI (
dosm_gdp_gni_annual_nominal) ยท sampleAnnual Real GDP & GNI: 1970 to Present (
dosm_gdp_gni_annual_real)Lookup Table: GDP (
dosm_gdp_lookup)OpenDOSM Quarterly Nominal GDP (
dosm_gdp_qtr_nominal) ยท sampleQuarterly Nominal GDP by Expenditure Type (
dosm_gdp_qtr_nominal_demand)Quarterly Nominal GDP by Expenditure Subtype (
dosm_gdp_qtr_nominal_demand_granular)Quarterly Nominal GDP by Economic Sector (
dosm_gdp_qtr_nominal_supply)Quarterly Nominal GDP by Economic Subsector (
dosm_gdp_qtr_nominal_supply_granular)OpenDOSM Quarterly Real GDP (
dosm_gdp_qtr_real) ยท sampleQuarterly Real GDP by Expenditure Type (
dosm_gdp_qtr_real_demand)Quarterly Real GDP by Expenditure Subtype (
dosm_gdp_qtr_real_demand_granular)OpenDOSM Quarterly Real GDP (Seasonally Adjusted) (
dosm_gdp_qtr_real_sa) ยท sampleQuarterly Real GDP (Seasonally Adjusted) by Expenditure Type (
dosm_gdp_qtr_real_sa_demand)Quarterly Real GDP (Seasonally Adjusted) by Economic Sector (
dosm_gdp_qtr_real_sa_supply)Quarterly Real GDP by Economic Sector (
dosm_gdp_qtr_real_supply)Quarterly Real GDP by Economic Subsector (
dosm_gdp_qtr_real_supply_granular)OpenDOSM Annual Real GDP by State & Sector (
dosm_gdp_state_real_supply) ยท sampleAccess to Basic Amenities by State & District (
dosm_hh_access_amenities)OpenDOSM Household Expenditure by DUN (
dosm_hh_expenditure_dun) ยท sampleOpenDOSM Household Expenditure by Parliamentary Constituency (
dosm_hh_expenditure_parlimen) ยท sampleOpenDOSM Household Income, Malaysia (
dosm_hh_income) ยท sampleOpenDOSM Household Income by District (
dosm_hh_income_district) ยท sampleHousehold Income by DUN (
dosm_hh_income_dun)Household Income by Parliament (
dosm_hh_income_parlimen)OpenDOSM Household Income by State (
dosm_hh_income_state) ยท sampleOpenDOSM Income Inequality, Malaysia (
dosm_hh_inequality) ยท sampleOpenDOSM Income Inequality by District (
dosm_hh_inequality_district) ยท sampleIncome Inequality by DUN (
dosm_hh_inequality_dun)Income Inequality by Parliament (
dosm_hh_inequality_parlimen)OpenDOSM Income Inequality by State (
dosm_hh_inequality_state) ยท sampleOpenDOSM Poverty, Malaysia (
dosm_hh_poverty) ยท sampleOpenDOSM Poverty by District (
dosm_hh_poverty_district) ยท samplePoverty by DUN (
dosm_hh_poverty_dun)Poverty by Parliament (
dosm_hh_poverty_parlimen)OpenDOSM Poverty by State (
dosm_hh_poverty_state) ยท sampleNumber of Households and Living Quarters (
dosm_hh_profile)Number of Households and Living Quarters by State (
dosm_hh_profile_state)Household Income and Expenditure: Administrative Districts (
dosm_hies_district)Household Income by Percentile (
dosm_hies_malaysia_percentile)Household Income and Expenditure: States (
dosm_hies_state)Household Income by State & Percentile (
dosm_hies_state_percentile)Headline Wholesale & Retail Trade (
dosm_iowrt)Wholesale & Retail Trade by Division (2 digit) (
dosm_iowrt_2d)Wholesale & Retail Trade by Group (3 digit) (
dosm_iowrt_3d)Industrial Production Index (IPI) (
dosm_ipi)IPI by Section (1 digit) (
dosm_ipi_1d)OpenDOSM IPI for Domestic-Oriented Divisions (
dosm_ipi_domestic) ยท sampleOpenDOSM IPI for Export-Oriented Divisions (
dosm_ipi_export) ยท sampleAnnual Principal Labour Force Statistics by District (
dosm_lfs_district)Annual Principal Labour Force Statistics by DUN (
dosm_lfs_dun)OpenDOSM Monthly Labour Force Statistics (
dosm_lfs_month) ยท sampleMonthly Unemployment by Duration (
dosm_lfs_month_duration)Monthly Principal Labour Force Statistics, Seasonally Adjusted (
dosm_lfs_month_sa)Monthly Employment by Status in Employment (
dosm_lfs_month_status)Monthly Youth Unemployment (
dosm_lfs_month_youth)Annual Principal Labour Force Statistics by Parliament (
dosm_lfs_parlimen)OpenDOSM Quarterly Labour Force Statistics (
dosm_lfs_qtr) ยท sampleQuarterly Skills-Related Underemployment by Age (
dosm_lfs_qtr_sru_age)Quarterly Skills-Related Underemployment by Sex (
dosm_lfs_qtr_sru_sex)OpenDOSM Quarterly Labour Force Statistics by State (
dosm_lfs_qtr_state) ยท sampleQuarterly Time-Related Underemployment by Age (
dosm_lfs_qtr_tru_age)Quarterly Time-Related Underemployment by Sex (
dosm_lfs_qtr_tru_sex)Annual Principal Labour Force Statistics by State & Sex (
dosm_lfs_state_sex)OpenDOSM Annual Labour Force Statistics (
dosm_lfs_year) ยท sampleAnnual Principal Labour Force Statistics by Sex (
dosm_lfs_year_sex)Annual Marriages (
dosm_marriages)Annual Marriage by Age Group (
dosm_marriages_age)OpenDOSM Annual Marriages by State and Sex (
dosm_marriages_state) ยท sampleOpenDOSM Annual Marriages by State, Age, and Sex (
dosm_marriages_state_age) ยท sampleMCOICOP (
dosm_mcoicop)MSIC (
dosm_msic)OpenDOSM Annual Population, Malaysia (
dosm_population_malaysia) ยท sampleOpenDOSM Annual Population by Parliamentary Constituency (
dosm_population_parlimen) ยท sampleOpenDOSM Annual Population by State (
dosm_population_state) ยท sampleOpenDOSM Monthly Producer Price Index (
dosm_ppi) ยท sampleMonthly PPI by Section (1 digit) (
dosm_ppi_1d)Monthly PPI by SITC Section (1 digit) (
dosm_ppi_sitc)Annual Productivity by Economic Sector (
dosm_productivity_annual)Annual Productivity for Priority Subsectors (
dosm_productivity_annual_priority)Lookup Table: Labour Productivity (
dosm_productivity_lookup)Quarterly Productivity by Economic Sector (
dosm_productivity_qtr)SITC (
dosm_sitc)SITC: Stage of Processing (
dosm_sitc_sop)Headline Services Producer Price Index (SPPI) (
dosm_sppi)SPPI by Section (1 digit) (
dosm_sppi_1d)SPPI by Division (2 digits) (
dosm_sppi_2d)OpenDOSM Monthly Trade by End Use (BEC) (
dosm_trade_enduse_bec) ยท sampleOpenDOSM Monthly Trade Headline (
dosm_trade_headline) ยท sampleOpenDOSM Monthly Trade by SITC Section (
dosm_trade_sitc_1d) ยท sampleMalaysian Economic Indicators (
economic_indicators)Employment by MSIC Sector and Sex (
employment_sector)Foreign Direct Investment Flows (
fdi_flows)TFR and ASFR (
fertility)Annual Nominal GDP by Economic Sector (
gdp_annual_nominal_supply)Annual Real GDP by Economic Sector (
gdp_annual_real_supply)Annual Nominal GDP & GNI: 1947 to Present (
gdp_gni_annual_nominal)OpenDOSM Quarterly Nominal GDP (
gdp_qtr_nominal)OpenDOSM Quarterly Real GDP (
gdp_qtr_real)Quarterly Real GDP (Seasonally Adjusted) (
gdp_qtr_real_sa)Annual Real GDP by State & Economic Sector (
gdp_state_real_supply)Household Expenditure by DUN (
hh_expenditure_dun)Household Expenditure by Parliament (
hh_expenditure_parlimen)Household Income (
hh_income)Household Income by Administrative District (
hh_income_district)Household Income by State (
hh_income_state)Income Inequality (
hh_inequality)Income Inequality by District (
hh_inequality_district)Income Inequality by State (
hh_inequality_state)Poverty (
hh_poverty)Poverty by Administrative District (
hh_poverty_district)Poverty by State (
hh_poverty_state)Monthly IPI for Domestic-Oriented Divisions (
ipi_domestic)Monthly IPI for Export-Oriented Divisions (
ipi_export)OpenDOSM Monthly Labour Force Statistics (
lfs_month)Quarterly Principal Labour Force Statistics by State (
lfs_qtr_state)Annual Principal Labour Force Statistics (
lfs_year)Annual Marriages by State (
marriages_state)Annual Marriage by State & Age Group (
marriages_state_age)OpenDOSM Annual Population by Administrative District (
population_district)Annual Population by State Constituency (
population_dun)OpenDOSM Annual Population, Malaysia (
population_malaysia)Annual Population by Parliamentary Constituency (
population_parlimen)OpenDOSM Annual Population by State (
population_state)Monthly PPI by Stage of Processing (
ppi_sop)SDG 04-6-1: Proficiency in Functional Literacy and Numeracy (
sdg_04-6-1)SDG 10-C-1: Remittance Costs as a % of the Amount Remitted (
sdg_10-c-1)OpenDOSM Monthly Trade Headline (
trade_headline)Monthly Trade by SITC Section (1 digit) (
trade_sitc_1d)
Energy Commission (energy_commission)
Households with Access to Electricity (
electricity_access)data.gov.my Electricity Supply (
electricity_supply) ยท sampleCo-Generators โ Malaysia (
st_cogenerators)Number of Electricity Consumers โ Malaysia (
st_consumers)Current Co-Generation Licensees โ Malaysia (
st_current_cogen_licensees)Current Independent Power Producer Licensees โ Malaysia (
st_current_ipp_licensees)Current Large-Scale Solar Licensees โ Malaysia (
st_current_lss_licensees)Current Renewable Energy Licensees โ Malaysia (
st_current_re_licensees)Electrical Competency Certificates Issued โ Malaysia (
st_elesca)National Energy Balance (Malaysia, annual PDF) (
st_energy_balance_pdf)Generation Mix (GWh) โ Malaysia (
st_generation_mix_gwh)Installed Generation Capacity (MW) โ Malaysia (
st_installed_capacity_mw)Independent Power Producers โ Malaysia (
st_ipps)Maximum Demand (MW) โ Malaysia (
st_max_demand_mw)Renewable Energy Projects โ Malaysia (
st_re_projects)Electricity Sales by Unit (GWh) โ Malaysia (
st_sales_unit_gwh)Electricity Sales by Value (RM million) โ Malaysia (
st_sales_value_rm_million)
Employees Provident Fund (epf)
data.gov.my Annual EPF Dividend Rates (
epf_dividend) ยท sample
Forestry Department (forestry_department)
Area of Permanent Forest Reserves (
dosm_forest_reserve)Area of Permanent Forest Reserves by State (
dosm_forest_reserve_state)Production of Major Timber Products by State (
dosm_timber_production)
Immigration Department of Malaysia (immigration)
Monthly Arrivals by Nationality & Sex (
arrivals)Monthly Arrivals by State of Entry, Nationality & Sex (
arrivals_soe)Monthly Passport Issuances by State and Branch (
passports)
Legal Aid Department (jbg)
Legal Advisory Services by Branch (
legal_advisory_branch)Legal Advisory Services by Branch & Case Type (
legal_advisory_case_type)Legal Advisory Services by Branch & Category (
legal_advisory_category)Legal Advisory Services by Branch & Subcategory (
legal_advisory_subcategory)
National Digital Department (jdn)
Currency Codes (ISO 4217) (
currency_codes)List of Datasets on data.gov.my (
datasets)Transactional Data: Official Government Mobile Applications (
government_apps)Number of Active Government Mobile Applications (
government_apps_active)Downloads of Government Mobile Applications (
government_apps_downloads)Transactional Data: User Reviews of Government Mobile Applications (
government_apps_reviews)Number of Datasets on data.gov.my (
metrics_content)Cumulative Views and Downloads by Dataset (
metrics_dataset_cumul)Daily Usage Metrics for data.gov.my (
usage_metrics)Daily OpenAPI Hits by Endpoint (
usage_metrics_openapi)Cumulative OpenAPI Hits by Endpoint (
usage_metrics_openapi_cumul)
Department of Mineral and Geoscience (jmg)
Extraction of Minerals by State and Commodity (
dosm_mineral_extraction)
Road Transport Department Malaysia (jpj)
data.gov.my Monthly Vehicle Registrations by Type and Fuel (
dgm_vehicle_registrations_type_fuel) ยท sampleVehicle Registration Transactions (
registration_transactions_all)Car Registration Transactions (
registration_transactions_car)Motorcycle Registration Transactions (
registration_transactions_motorcycle)Monthly Vehicle Registrations by Vehicle and Fuel Type (
registrations_type_fuel)
National Registration Department (jpn)
Daily Live Births (
births)Annual Deaths (
deaths)Annual Live Births (
dosm_births_annual)Annual Live Births by Sex & Ethnicity (
dosm_births_annual_sex_ethnic)Annual Live Births by State, Sex, & Ethnicity (
dosm_births_annual_sex_ethnic_state)Annual Live Births by State (
dosm_births_annual_state)Annual Live Births by District & Sex (
dosm_births_district_sex)Annual Deaths by District & Sex (
dosm_deaths_district_sex)Annual Early Childhood Deaths (
dosm_deaths_early_childhood)Annual Early Childhood Deaths by Sex (
dosm_deaths_early_childhood_sex)Annual Early Childhood Deaths by State (
dosm_deaths_early_childhood_state)Annual Early Childhood Deaths by State & Sex (
dosm_deaths_early_childhood_state_sex)Annual Maternal Deaths (
dosm_deaths_maternal)Annual Maternal Deaths by State (
dosm_deaths_maternal_state)Annual Deaths by Sex & Ethnicity (
dosm_deaths_sex_ethnic)Annual Deaths by State, Sex, & Ethnicity (
dosm_deaths_sex_ethnic_state)Annual Deaths by State (
dosm_deaths_state)
Ministry of Health Malaysia (kkm)
Daily COVID-19 Cases by State (
covid_cases)Daily COVID-19 Cases by Age Group & State (
covid_cases_age)Daily COVID-19 Cases by Vaccination Status & State (
covid_cases_vaxstatus)COVID-19 Deaths Line List (
covid_deaths_linelist)Annual Stillbirths (
dosm_stillbirths)Annual Stillbirths by State (
dosm_stillbirths_state)data.gov.my Healthcare Staff by State and Staff Type (
healthcare_staff) ยท sampleHospital Beds by State and Hospital Type (
hospital_beds)data.gov.my Infant Immunisation Coverage (
infant_immunisation) ยท sampleKKM iDengue Weekly Dengue Cases (
kkm_idengue) ยท sampleKKMNOW Hospital Bed Utilisation by Facility/State (
kkmnow_bedutil)KKMNOW Daily Blood Donations and Stock (
kkmnow_blood)KKMNOW Weekly COVID-19 Epidemiological Surveillance (
kkmnow_covidepid)KKMNOW COVID-19 Daily Cases (
kkmnow_covidnow)KKMNOW COVID-19 Vaccine Registrations (
kkmnow_covidvax)KKMNOW Healthcare Resources/Facilities Directory (
kkmnow_facilities)KKMNOW Organ Donation Pledges and Deaths (
kkmnow_organ)KKMNOW PeKa B40 Daily Health Screenings by State (
kkmnow_pekab40)data.gov.my MNHA: Total (TEH) and Current (CHE) Expenditure on Health (
mnha) ยท sampleMNHA: MOH Expenditure on Health (
mnha_moh)Nutritional Status of Children Under 5 by Sex (
nutrition_children_sex)Nutritional Status of Children Under 5 by Strata (
nutrition_children_strata)Access to Sanitary Latrines by State (
sanitation_access)SDG 03-3-1: HIV Incidence per 1,000 Uninfected Population (
sdg_03-3-1)data.gov.my Sexually Transmitted Diseases (STDs) by State (
std_state) ยท sampleDaily COVID-19 Vaccine Registrations by State (
vaxreg_covid)COVID-19 Vaccination Registrations by Demographic Group (
vaxreg_covid_demog)
Ministry of Domestic Trade and Cost of Living (kpdn)
PriceCatcher: Item Lookup (
dosm_lookup_item)PriceCatcher: Premise Lookup (
dosm_lookup_premise)PriceCatcher (Grocery Prices) (
pricecatcher) ยท sample
Keretapi Tanah Melayu Berhad (ktmb)
data.gov.my Monthly KTMB Ridership (
dgm_ktmb_ridership_monthly) ยท sampleGTFS Realtime โ KTMB Vehicle Positions (
gtfs_realtime_ktmb)GTFS Static โ KTMB Rail Schedule (
gtfs_static_ktmb)Daily KTMB Ridership (
ridership_ktmb_daily)Monthly KTMB Ridership (
ridership_ktmb_monthly)KTMB ETS Origin-Destination Ridership (
ridership_od_ets)KTMB Intercity Origin-Destination Ridership (
ridership_od_intercity)KTMB Komuter Origin-Destination Ridership (
ridership_od_komuter)KTMB Komuter Utara Origin-Destination Ridership (
ridership_od_komuter_utara)KTMB Shuttle Tebrau Origin-Destination Ridership (
ridership_od_shuttle_tebrau)
Majlis Bandaraya Pulau Pinang (mbpp)
MBPP Weather Station Observations (
mbpp_weather_stations)
Malaysian Communications and Multimedia Commission (mcmc)
data.gov.my Cellular Subscribers by Plan Type (
cellular_subscribers) ยท samplePostcode Dataset (
poskod)
Malaysian Meteorological Department (met)
Astronomy Almanac (
almanak_astronomi)MET Malaysia Weather Forecast (
met_weather) ยท sample
Ministry of Home Affairs Malaysia (mha)
SDG 16-2-2: Victims of Human Trafficking (
sdg_16-2-2)
Ministry of Housing and Local Government (mhlg)
data.gov.my Female Representation in Local Authorities (
local_authority_sex) ยท sample
Ministry of Education Malaysia (moe)
School Completion Rates by State (
completion_school_state)Enrolment in Government Schools by District (
enrolment_school_district)data.gov.my Public Education Institutions by District (
schools_district) ยท sampleTeachers in Government Schools by District (
teachers_district)
Ministry of Finance Malaysia (mof)
ePerolehan Tender Notices (DIIKLANKAN) (
eperolehan-diklankan) ยท sampleAnnual Budget Allocation for the Ministry of Education (
federal_budget_moe)Annual Budget Allocation for the Ministry of Health (
federal_budget_moh)Quarterly Federal Development Expenditure (
federal_finance_qtr_de)Annual Federal Government Revenue (
federal_finance_year_revenue)Malaysian Fuel Prices (
fuelprice) ยท sample
Ministry of Higher Education Malaysia (mohe)
Lecturers in Public Universities by Citizenship & Sex (
lecturers_uni)
Ministry of Transport Malaysia (mot)
data.gov.my Daily Public Transport Ridership (
ridership_headline)
MYNIC (mynic)
Number of Registered .MY Domains (
domains)Number of Registered .MY Domains with DNSSEC (
domains_dnssec)Number of Registered Internationalised .MY Domains (
domains_idn)Number of Registered .MY Domains with IPv6 DNS (
domains_ipv6)
National Audit Department Malaysia (national_audit)
State Government Expenditure (
state_finance_expenditure)State Government Revenue (
state_finance_revenue)
National Blood Centre (national_blood_centre)
Daily Blood Donations by Blood Group (
blood_donations)data.gov.my Daily Blood Donations by Blood Group & State (
blood_donations_state) ยท sample
National Pharmaceutical Regulatory Agency (npra)
Cosmetic Product Notifications (
cosmetic_notifications)Cancelled Cosmetic Product Notifications (
cosmetic_notifications_cancelled)Approved Manufacturers of Cosmetic Products (
cosmetics_manufacturers)Licensed Pharmaceutical Importers (
pharmaceutical_importers)Licensed Pharmaceutical Manufacturers (
pharmaceutical_manufacturers)Registered Pharmaceutical Products (
pharmaceutical_products)Cancelled Pharmaceutical Product Registrations (
pharmaceutical_products_cancelled)Licensed Pharmaceutical Wholesalers (
pharmaceutical_wholesalers)
Ministry of Natural Resources and Environmental Sustainability (nres)
Greenhouse Gas Emissions (
ghg_emissions)
National Transplant Resource Centre (ntrc)
Daily Organ Donation Pledges (
organ_pledges)Daily Organ Donation Pledges by State (
organ_pledges_state)
Parliament of Malaysia (parliament)
Malaysian Parliament Hansard MPs (
hansard_mps)Malaysian Parliamentary Terms (
hansard_parliamentary_terms)Malaysian Parliament Hansard Sitting Catalogue (
hansard_sittings)data.gov.my Female Representation in Parliament (
parliament_sex) ยท sample
Payments Network Malaysia (paynet)
Daily DirectDebit Transactions (
trnsc_daily_directdebit)Daily FPX Transactions (
trnsc_daily_fpx)Daily JomPAY Transactions (
trnsc_daily_jompay)Daily Shared ATM Network (SAN) Transactions (
trnsc_daily_san)
Royal Malaysia Police (pdrm)
Drug Arrests by Sex & Age (
drug_arrests_age)Drug Arrests by Sex & Ethnicity (
drug_arrests_ethnicity)SDG 16-1-1: Victims of Intentional Homicide (
sdg_16-1-1)
Prasarana Malaysia Berhad (prasarana)
GTFS Realtime โ Rapid KL Bus Vehicle Positions (
gtfs_realtime_prasarana_bus_kl)GTFS Realtime โ MRT Feeder Bus Vehicle Positions (
gtfs_realtime_prasarana_bus_mrtfeeder)GTFS Realtime โ Rapid Penang Bus Vehicle Positions (
gtfs_realtime_prasarana_bus_penang)GTFS Static โ Rapid KL Bus Schedule (
gtfs_static_prasarana_bus_kl)GTFS Static โ Rapid Kuantan Bus Schedule (
gtfs_static_prasarana_bus_kuantan)GTFS Static โ MRT Feeder Bus Schedule (
gtfs_static_prasarana_bus_mrtfeeder)GTFS Static โ Rapid Penang Bus Schedule (
gtfs_static_prasarana_bus_penang)GTFS Static โ Rapid KL Rail Schedule (
gtfs_static_prasarana_rail_kl)Daily Origin-Destination Ridership: BRT Sunway Line (
ridership_od_brt_daily)Daily Origin-Destination Ridership: Rapid Rail (KV) (
ridership_od_rapidrail_daily)
Prisons Department of Malaysia (prisons)
Prisoners by Prison Centre and Sex (
prisoners_prison)data.gov.my Prisoners by State and Sex (
prisoners_state) ยท sample
ProtectHealth Corporation (protecthealth)
Daily PeKaB40 Health Screenings (
pekab40_screenings)data.gov.my Daily PeKaB40 Health Screenings by State (
pekab40_screenings_state) ยท sample
Singapore Government Data.gov.sg (sg-datagov)
COE Bidding Results (SG) (
sg_datagov_coe_bidding)HDB Dataset Metadata (SG) (
sg_datagov_hdb_metadata)HDB Resale Flat Prices Jan-2017 onwards (SG) (
sg_datagov_hdb_resale_prices)Taxi Availability real-time (SG) (
sg_datagov_taxi_availability)Weather Readings real-time (SG) (
sg_datagov_weather_readings)
National Water Services Commission (span)
data.gov.my Access to Treated Water by State & Strata (
water_access) ยท sampleWater Consumption by State and Sector (
water_consumption)data.gov.my Water Production by State (
water_production) ยท sample
Tenaga Nasional Berhad (tnb)
Monthly Electricity Consumption (
electricity_consumption)
Current coverage
Refresh cadence
Dataset | Refresh cadence |
| monthly |
| daily |
| monthly |
| monthly |
| daily |
| daily |
| daily |
| monthly |
| daily (weekdays) |
| monthly |
| monthly |
| daily |
| daily (weekdays) |
| daily |
| monthly |
| quarterly |
| annual |
| annual |
| monthly |
| monthly |
| daily |
| daily |
| daily |
| daily |
| annual |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| annual |
| as-required |
| monthly |
| annual |
| monthly |
| annual |
| monthly |
| annual |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| daily |
| monthly |
| hourly |
| monthly |
| hourly |
| monthly |
| monthly |
| monthly |
| monthly |
| daily |
| as-required |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| as-required |
| quarterly |
| quarterly |
| quarterly |
| quarterly |
| quarterly |
| quarterly |
| quarterly |
| quarterly |
| quarterly |
| quarterly |
| quarterly |
| quarterly |
| quarterly |
| annual |
| annual |
| biennial to triennial (survey years) |
| biennial to triennial (survey years) |
| biennial to triennial (survey years) |
| biennial to triennial (survey years) |
| annual |
| annual |
| biennial to triennial (survey years) |
| biennial to triennial (survey years) |
| biennial to triennial (survey years) |
| annual |
| annual |
| biennial to triennial (survey years) |
| biennial to triennial (survey years) |
| biennial to triennial (survey years) |
| annual |
| annual |
| biennial to triennial (survey years) |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| annual |
| annual |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| annual |
| quarterly |
| quarterly |
| quarterly |
| quarterly |
| quarterly |
| quarterly |
| annual |
| annual |
| annual |
| as-required |
| as-required |
| annual |
| annual |
| annual |
| annual |
| as-required |
| monthly |
| as-required |
| annual |
| annual |
| annual |
| monthly |
| monthly |
| monthly |
| annual |
| annual |
| as-required |
| quarterly |
| as-required |
| as-required |
| quarterly |
| quarterly |
| quarterly |
| annual |
| annual |
| annual |
| monthly |
| monthly |
| monthly |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| monthly |
| annual |
| monthly |
| monthly |
| monthly |
| annual |
| hourly |
| annual |
| monthly |
| daily (weekdays, 0900 MYT) |
| daily (weekdays, 1130 MYT) |
| daily (weekdays, 1200 MYT) |
| daily (weekdays, 1700 MYT) |
| quarterly |
| annual |
| annual |
| quarterly |
| quarterly |
| quarterly |
| quarterly |
| annual |
| quarterly |
| annual |
| annual |
| monthly |
| monthly |
| weekly |
| annual |
| annual |
| annual |
| quarterly |
| quarterly |
| quarterly |
| annual |
| annual |
| monthly |
| monthly |
| monthly |
| monthly |
| 30 seconds |
| 30 seconds |
| 30 seconds |
| 30 seconds |
| 30 seconds |
| 30 seconds |
| 30 seconds |
| 30 seconds |
| 30 seconds |
| 30 seconds |
| 30 seconds |
| 30 seconds |
| 30 seconds |
| 30 seconds |
| daily |
| as-required |
| as-required |
| as-required |
| as-required |
| as-required |
| as-required |
| as-required |
| as-required |
| as-required |
| as-required |
| as-required |
| as-required |
| as-required |
| as-required |
| as-required |
| as-required |
| as-required |
| as-required |
| annual |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| annual |
| annual |
| monthly |
| annual |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| daily |
| daily |
| daily |
| weekly |
| daily |
| daily |
| annual |
| daily |
| daily |
| annual |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| quarterly |
| quarterly |
| annual |
| annual |
| as-required |
| as-required |
| annual |
| annual |
| hourly |
| daily |
| monthly |
| daily |
| annual |
| annual |
| monthly |
| annual |
| annual |
| daily |
| daily |
| annual |
| monthly |
| monthly |
| monthly |
| monthly |
| daily |
| daily |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| annual |
| annual |
| annual |
| annual |
| annual |
| as-required |
| monthly |
| monthly |
| monthly |
| monthly |
| monthly |
| annual |
| annual |
| daily |
| daily |
| daily |
| monthly |
| daily |
| daily |
| monthly |
| daily |
| daily |
| daily |
| daily |
| daily |
| daily |
| daily |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| annual |
| monthly |
| monthly |
| monthly |
| daily |
| daily |
| monthly |
| annual |
| monthly |
| as-required |
| as-required |
| as-required |
| as-required |
| annual |
| annual |
| annual |
| monthly |
| annual |
| monthly |
| annual |
| monthly |
| monthly |
| annual |
| annual |
| annual |
| annual |
| monthly |
| monthly |
| daily |
| daily |
| daily |
| daily |
| daily |
| daily |
| daily |
| daily |
| annual |
| annual |
| annual |
| annual |
| annual |
DataPulse currently tracks the portfolio declared in datapulse.json.
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.
External verification
For a clone-less, independent check of the published Ed25519 dataset envelope, GitHub source parity, and Rekor/Sigstore health witness, see Verify DataPulse externally.
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: verify_dataset โ get_freshness_summary. The standard
offline path is the verify_external.py command above.
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.
Monitoring
The VPS
datapulse-health.timerwakes 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 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).
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 (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.
Available Tools
19 toolscheck_reconciliationCheck Cross-Source ReconciliationARead-onlyIdempotentInspect
Return the published cross-source reconciliation group for a dataset name or id, including per-member counts, dates, statuses, tolerances, and contextual deltas. A discrepancy requires human review and does not prove either source is wrong.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_name | Yes | Dataset id or name to reconcile, e.g. 'interestrates' or 'Monthly Interest Rates'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal readOnly, idempotent, open-world, and non-destructive behavior. The description adds valuable interpretive context beyond that: it warns that a discrepancy requires human review and does not prove either source is wrong, and the term 'published' indicates a precomputed snapshot. This is meaningful behavioral guidance not captured by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The core action and return content are front-loaded, and the caveat about discrepancy interpretation is placed as a separate, purposeful sentence. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity, single-parameter read-only tool with full annotation coverage and an output schema, the description covers the essential behavioral and informational aspects. It explains what is returned and how to interpret deltas, leaving nothing critical missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with the single parameter dataset_name already documented with examples and a clear description. The tool description adds no additional parameter-level nuance, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Return') and a specific resource ('published cross-source reconciliation group'), and enumerates what is included (counts, dates, statuses, tolerances, contextual deltas). This clearly distinguishes it from sibling tools like get_freshness_summary or find_anomalies, which target different concerns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its usage context: it returns an existing published reconciliation group rather than computing a fresh check. However, it does not explicitly state when to use this tool over alternatives, name any sibling, or exclude any condition (e.g., 'for live checks, use verify_dataset'). The guidance is adequate but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_anomaliesIdentify Dataset Update AnomaliesARead-onlyIdempotentInspect
Return datasets flagged by the latest published anomaly detection (anomalies), ranked by how far the observed update interval exceeds its threshold. Optionally require a minimum publish-reliability grade; includes pipeline-computed anomaly and reliability evidence so agents do not recompute it.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Optional exact detection mode; e.g. 'rolling_14d' or 'cadence_fallback'. | |
| limit | No | Maximum ranked anomalies to return; integer from 1 to 200, e.g. 50. | |
| min_reliability | No | Optional minimum publish-reliability grade; e.g. 'C' keeps A, B, and C and excludes insufficient data. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, openWorld, idempotent, non-destructive), so the description's added behavioral details are useful: results come from the 'latest published anomaly detection', are ranked by interval/threshold deviation, and include pipeline-computed evidence rather than requiring the agent to calculate it. This adds meaningful behavioral context beyond the annotations, though it does not discuss rate limits or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: the first front-loads the core purpose and ranking behavior, the second adds the optional filter and a key workflow benefit. Every sentence earns its place with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool is a read-only query with three optional parameters, a full output schema, and complete parameter descriptions, the description is sufficient: it explains what is returned, the ordering, the optional reliability filter, and that evidence is precomputed. No critical operational detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents mode, limit, and min_reliability. The description adds no new semantic detail for mode or limit and only restates the reliability option in nearly the same words as the schema. Baseline 3 is appropriate because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Return datasets flagged by the latest published anomaly detection'. It also defines the ranking criterion ('ranked by how far the observed update interval exceeds its threshold'), which clearly distinguishes this from sibling tools like find_stale, find_deteriorating, and find_recovering. No ambiguity remains about what the tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the intended use case clear: query pre-computed, published anomaly results rather than recomputing them ('includes pipeline-computed anomaly and reliability evidence so agents do not recompute it'). It also mentions the optional reliability filter. However, it does not explicitly name alternative tools or state when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_by_licenceScope Reusable Data by LicenceARead-onlyIdempotentInspect
Return all datasets with the given licence, summarised. Use to enumerate what's available under a specific licence for compliance/reuse scoping.
| Name | Required | Description | Default |
|---|---|---|---|
| licence | Yes | Exact licence name or supported alias, e.g. 'Creative Commons Attribution 4.0'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds that results are 'summarised' and licence matching is by exact name or alias, but does not go far beyond what the schema and annotations already convey. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no filler. It front-loads the action and outcome, then adds the relevant use case, making every sentence earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only one required parameter, no nested objects, and an output schema present, the description covers the essential purpose and usage context. The word 'summarised' is slightly vague, but the output schema can reasonably carry the return-format details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description adds little beyond the schema's examples and 'exact licence name or supported alias' note. The parameter meaning is clear, but the description does not enrich it significantly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Return all datasets with the given licence, summarised.' It clearly identifies the licensing scope and differentiates itself from broad search tools like search_datasets by focusing on a specific licence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use to enumerate what's available under a specific licence for compliance/reuse scoping' gives a clear context and intent. It does not explicitly mention when not to use it or name alternatives, but the use case is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_deterioratingIdentify Deteriorating Dataset TrendsARead-onlyIdempotentInspect
Return datasets whose published freshness trend is deteriorating, ranked by staleness slope. Optionally require a minimum historical anomaly rate; includes pipeline-computed trend and reliability evidence so agents do not recompute it.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum ranked deteriorating datasets to return; integer from 1 to 200, e.g. 50. | |
| min_anomaly_rate | No | Optional minimum percent of anomaly-evaluable history days, e.g. 25.0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, open-world, and non-destructive behavior. The description adds useful behavioral detail beyond the annotations: results are ranked by staleness slope, they include pipeline-computed trend and reliability evidence, and callers should not recompute that evidence. This gives an agent meaningful expectations about output content and cost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, starts with the core verb and resource, and contains no filler. Every clause contributes: the ranking criterion, the optional filter, and the note about avoiding recomputation. It is efficiently front-loaded for an agent scanning sibling tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two optional parameters, a present output schema, and strong annotations (readOnly, idempotent, non-destructive), the description is complete for selection and invocation. It covers what the tool returns, how it ranks, and an important behavioral caveat about not recomputing evidence. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both limit and min_anomaly_rate in detail. The description adds only slight semantic color ('staleness slope', 'historical anomaly rate') that mostly rephrases the schema. Under the baseline rule for high schema coverage, a 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action: return datasets whose published freshness trend is deteriorating, and it adds a distinct ranking criterion ('staleness slope') that separates it from siblings like find_stale or find_recovering. The resource and condition are unambiguous, and the mention of trend-based deterioration distinguishes this from snapshot staleness tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys when to use the tool: when an agent needs deteriorating freshness trends and wants pipeline-computed trend/evidence rather than recomputing it. It does not explicitly name alternatives or state exclusion conditions, but the 'so agents do not recompute it' note is practical guidance. Clear context without formal when-not-to-use guidance keeps this at a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_recoveringIdentify Recovering Dataset TrendsARead-onlyIdempotentInspect
Return datasets whose published freshness trend is recovering, with the fastest staleness reductions first. Includes pipeline-computed trend and publish-reliability evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum ranked recovering datasets to return; integer from 1 to 200, e.g. 50. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral detail beyond the annotations by specifying the sort order and noting that the result includes pipeline-computed trend and publish-reliability evidence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no filler. The first sentence front-loads the core action and ordering; the second adds relevant information about included evidence without repeating schema or annotation content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only one optional parameter and an output schema present, the description is largely complete: it states what is returned, the ordering, and the extra evidence included. A small gap is that it does not explicitly state the tool's scope or filtering behavior, but given the simplicity of the interface, this is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the only parameter (limit) is fully documented in the schema with range and examples. The description adds no extra parameter semantics, but that is acceptable given the schema already carries the full weight for this simple parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and a clear resource ('datasets whose published freshness trend is recovering'), and it states the ordering ('fastest staleness reductions first'). It is easily distinguished from sibling tools like find_stale or find_deteriorating because it targets recovery rather than current staleness or decline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when this tool would be usefulโwhen the agent needs recovering freshness trendsโbut it does not explicitly say when to prefer it over alternatives or when not to use it. No sibling tools or exclusion conditions are mentioned, leaving the selection logic to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_schema_driftIdentify Schema and Content DriftARead-onlyIdempotentInspect
Return datasets with published structural or record-count drift evidence, ranked with structural changes first. Optionally require a minimum number of structural transitions; includes pipeline-computed evidence so agents do not infer drift from freshness alone.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum ranked drift results to return; integer from 1 to 200, e.g. 50. | |
| min_change_count | No | Minimum structural fingerprint or column-count transitions; integer from 0 to 100, e.g. 1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, and non-destructive behavior. The description adds meaningful behavioral context beyond this: results are ranked with structural changes first, a minimum transition count can be required, and evidence is pipeline-computed. This helps the agent understand what kind of output to expect and how evidence differs from freshness inferences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The core purpose and ranking behavior are front-loaded, the optional parameter is mentioned naturally, and the closing clause about pipeline-computed evidence prevents a common misconception. Every sentence contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with an output schema and full parameter documentation, this description is nearly complete. It explains the ranking, the optional filter, and the nature of the evidence. It does not detail edge cases like empty results or open-world behavior, but the annotations and output schema cover much of that context, so only minor gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents both parameters. The description adds a small clarification for min_change_count by calling it 'structural transitions', but this largely mirrors the schema's 'structural fingerprint or column-count transitions'. There is no substantial extra semantic value beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns datasets with published structural or record-count drift evidence, ranked with structural changes first. It names a specific verb, resource, and ordering behavior, and this distinguishes it from related sibling tools like find_stale or find_anomalies by focusing on drift evidence rather than general freshness.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: it should be used when pipeline-computed drift evidence is needed, and agents should not infer drift from freshness alone. It does not explicitly name alternative tools or exclusion conditions, but the guidance is specific enough to prevent the most likely misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_staleIdentify Freshness and Schema RisksARead-onlyIdempotentInspect
Return datasets whose status is aging, stale, or degraded, plus datasets missing from the latest health snapshot. Use when an agent needs to know which data has a freshness or schema-validity risk.
| Name | Required | Description | Default |
|---|---|---|---|
| max_age_hours | No | Maximum acceptable age of the latest health check in whole hours; non-negative integer, e.g. 72. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, openWorld, idempotent, non-destructive), so the description only needs to add selection behavior. It does so by expanding beyond the name: statuses aging/stale/degraded and the subtle inclusion of datasets missing from the snapshot. No auth, rate-limit, or side-effect warnings are needed for a read-only list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the result behavior and followed by a direct usage condition. There is no verbosity or redundant restating of the name/title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional parameter, full schema coverage, an output schema, and rich annotations, the description is nearly complete. The only notable gap is positioning against the large set of sibling tools, but the explicit use case mitigates that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents max_age_hours with default, minimum, examples, and a description, so the description adds little parameter-level meaning. With 100% schema coverage, the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Return datasets') with explicit inclusion criteria: status aging/stale/degraded plus datasets missing from the latest health snapshot. This goes beyond the name/title, but it does not explicitly distinguish itself from closely named siblings like find_schema_drift or find_unreliable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a clear 'Use when an agent needs to know which data has a freshness or schema-validity risk' statement, which gives an agent actionable context. It stops short of naming alternatives or saying when not to use it, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_unreliableIdentify Unreliable Dataset PublishingARead-onlyIdempotentInspect
Return datasets whose evaluated publish-reliability grade is at or below a threshold (the unreliable ones), with the worst grades and lowest on-time percentages first. Reliability measures timeliness of successful freshness observations, not uptime; sample days are included so agents can judge evidence depth.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum ranked unreliable datasets to return; integer from 1 to 200, e.g. 50. | |
| at_or_below_grade | No | Inclusive reliability threshold; e.g. 'C' returns grades C, D, and F. | C |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations: reliability is defined as timeliness of successful freshness observations rather than uptime, results are sorted by worst grades and lowest on-time percentages first, and sample days are included to help agents assess evidence depth. This gives the agent a clear model of what the tool returns and how to interpret it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The core behavior and ordering are front-loaded, and the clarifying note about reliability versus uptime earns its place by preventing a common misinterpretation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with two optional parameters, a full output schema, and strong annotations, this description is complete. It explains what is returned, how results are ordered, how reliability is measured, and why sample days appear, leaving no critical gap for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents both parameters, including defaults, ranges, and examples. The description adds some interpretive context around the threshold and ordering, but it does not materially expand on parameters beyond what the schema provides. The baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the verb, resource, and selection criterion: return datasets with a publish-reliability grade at or below a threshold. It also explains the ordering, which helps distinguish this from generic lookups. However, it does not explicitly distinguish itself from closely related sibling tools like find_stale or find_deteriorating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context implies this tool is for finding unreliable datasets by grade, and clarifies that reliability is about timeliness, not uptime. It does not explicitly state when to prefer this over find_stale or other sibling tools, nor does it mention exclusions. Guidance is therefore implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_passportRead Dataset Evidence PassportARead-onlyIdempotentInspect
Return one bounded, machine-readable Dataset Passport v1 for a canonical dataset ID. It reads the published Passport artifact only; it does not fetch an upstream source or create evidence. The Passport describes observed metadata and evidence availability, not semantic truth, completeness, certification, legal permission, safety, or AI admission.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes | Canonical dataset identifier for its published Passport v1, e.g. 'fuelprice'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description candidly discloses what the Passport is not: semantic truth, completeness, certification, legal permission, safety, or AI admission. It also clarifies the operation is read-only and artifact-bounded, adding meaningful behavioral context beyond the readOnly and idempotent hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with a distinct role: one states the output, one restricts the operation's scope, and one clarifies the semantic boundaries. No filler or redundancy; the key constraints are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single parameter, rich annotations, and an output schema present, the description is complete. It addresses selection criteria, operational boundaries, and semantic interpretation, leaving no critical gap for an agent deciding to call the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the only parameter, including an example and a description, so the baseline is 3. The description simply refers to a 'canonical dataset ID' without adding extra syntax or format detail, and the schema covers 100% of the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') with a precise resource ('one bounded, machine-readable Dataset Passport v1') and target ('canonical dataset ID'). It clearly distinguishes this tool from siblings by stating it reads only the published Passport artifact rather than fetching upstream sources or creating evidence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: this tool is for obtaining the published Passport v1 artifact and should not be used to fetch upstream sources or generate evidence. It does not explicitly name alternative sibling tools, but the scope and exclusions are explicit enough to guide an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_datasetInspect Dataset Health and DetailsARead-onlyIdempotentInspect
Return full detail for one dataset id, including its latest health status and last-verified timestamp, content_freshness_date, and freshness_signal_source (last_modified, content_parse, or none). Use to fetch the provenance/citation metadata for a dataset found via search_datasets and distinguish unknown-freshness from proven stale data.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes | Canonical dataset identifier, e.g. 'dosm_cpi_state'. See the registry catalogue for valid IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idemmpotentHint, covering safety and idempotency. The description adds value by exposing freshness_signal_source semantics (last_modified, content_parse, none) and the interpretative distinction between unknown freshness and proven stale data, which is behavioral context not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: one front-loads the operational return value, the other provides the invocation context. There is no extraneous repetition and every sentence contributes actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only, idempotent tool, the description covers what the call returns, the fields the agent can expect, and the intended decision use-case. With no output schema present it could have listed more about failure modes or edge cases, but the level of detail is adequate for selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter dataset_id is already fully documented in the schema with an example, min_length, and a pointer to the registry. The description does not add further parameter-level meaning, which is acceptable since the schema provides complete coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (return full detail for one dataset id), the exact resource scope, and the key returned fields. It also explicitly distinguishes itself from search_datasets by framing that tool as the discovery step. This makes the reference clear and disambiguated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear usage context: use it for a dataset found via search_datasets and to distinguish unknown freshness from proven stale data. It does not explicitly say when not to use it or name alternative tools for health/provenance inspection, so it stops short of a full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_evidenceAudit Published Evidence ReceiptARead-onlyIdempotentInspect
Use for a deep evidence audit or to inspect a provenance and evidence receipt. Returns the complete published evidence receipt for one dataset: probe time, transport, access dependency, freshness, schema drift / record-count drift, tolerance, status, anomaly fields, and receipt/evidence references. It reads published pipeline evidence, not a live source fetch: you may report what the pipeline observed, but must not infer the source is currently reachable or semantically true. Use it for a deep audit before or alongside verification. search_datasets โ get_evidence โ verify_evidence โ verify_attestation.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes | Canonical dataset identifier for its complete published evidence receipt, e.g. 'fuelprice'; this tool does not fetch the live source. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, open-world, idempotent, and non-destructive. The description adds material behavioral context beyond those hints: it reads published pipeline evidence rather than performing a live fetch, and it explicitly tells the agent not to infer current reachability or semantic truth of the source. This is valuable epistemic boundary-setting that annotations do not express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by the return contents, the critical live-fetch caveat, and the workflow placement. Every sentence earns its place; there is no redundant filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with a robust annotation set and an output schema, the description is complete: it explains what is returned, what the tool is for, what it is not for, and where it fits in the broader tool sequence. Nothing an agent needs to decide whether to call this tool and interpret its result correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter and the input schema already documents dataset_id with an example, a description, and the note that the tool does not fetch the live source. The tool description adds the context that this is for the complete published evidence receipt for one dataset, but it does not substantially change parameter understanding beyond the schema. Baseline 3 is appropriate given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('deep evidence audit', 'inspect a provenance and evidence receipt') and a specific resource ('complete published evidence receipt'), and enumerates the exact fields returned. It also distinguishes itself from live source fetches and positions itself relative to the verify workflow, so an agent can tell it apart from siblings like verify_evidence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use it for a deep audit before or alongside verification, and the workflow chain 'search_datasets โ get_evidence โ verify_evidence โ verify_attestation' provides ordering guidance. It also warns against using it to infer live source availability. It stops short of explicitly naming alternative tools to avoid, but the guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_freshness_summarySummarize Catalogue FreshnessARead-onlyIdempotentInspect
Return a freshness-at-a-glance summary of the published catalogue: fresh, aging, stale, and reference counts plus the latest health check time.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that the tool is readOnly, idempotent, open-world, and non-destructive, so the description only needs to add contextual scope. It usefully adds that the summary covers the 'published catalogue' and includes a health check timestamp, but it does not explain how freshness thresholds are defined or how current the counts are. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the resource and output type, then lists the exact components of the summary. There is no filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with an output schema and safety annotations, the description gives the necessary scope and tells the caller what kind of information will come back. Minor gaps remain around staleness definitions and how to route to sibling tools for detailed results, but these are not blockers for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is empty with 100% coverage, so there are no parameter meanings for the description to clarify. Per the baseline for a no-parameter tool, this is handled appropriately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and names the resource ('published catalogue') plus the exact output contents: fresh, aging, stale, and reference counts and the latest health check time. This makes it clearly a summary-level tool and distinct from the sibling find_* tools that surface individual records or anomalies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'freshness-at-a-glance summary' implies this is the overview tool to use before drilling into more specific siblings like find_stale or find_anomalies, but the description never explicitly states when to choose it over alternatives or when not to use it. Usage guidance is present only by implication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_provenanceCite Dataset ProvenanceARead-onlyIdempotentInspect
Use when asked 'can I cite this source?', for licence and attribution, or for citation-ready provenance. Returns source, steward, licence/attribution context, canonical URL, and compact published evidence context: probe time, transport, access dependency, freshness signal, schema drift / record-count drift context, anomaly flag, and status. Bind a citation to dataset identity, source/evidence URL, observed-at or last-checked time, DataPulse status/verdict, licence/attribution, and a receipt/evidence digest when available. You may cite the returned provenance and describe its published evidence; it is not a freshness guarantee and does not itself verify the source is current. For pre-trust use search_datasets โ verify_dataset โ get_provenance.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_ids | Yes | JSON array of 1 to 50 canonical dataset IDs for provenance and citation, e.g. ['fuelprice', 'pricecatcher']; this is not a live freshness check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation read-only, idempotent, and non-destructive. The description adds meaningful behavioral context by stating the result is not a freshness guarantee, does not itself verify currency, and that the returned provenance may be cited, which tells the agent how to treat the output and its limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The trigger use-case is front-loaded, followed by a compact list of returned fields, then the citation-binding guidance and an explicit caveat. The pre-trust workflow sentence earns its place as routing context; no sentence is wasted or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only provenance tool with a rich output schema and fully documented parameters, the description covers trigger, scope, return contents, limitations, and the intended surrounding workflow. There is no meaningful missing context that an agent would need to select or invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents dataset_ids with type, min/max, canonical examples, and a note that it is not a live freshness check (100% coverage). The description reinforces dataset identity and citation binding but does not add new parameter-level meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete trigger ('can I cite this source?') and states the resource: citation-ready dataset provenance. It enumerates the returned contents (source, steward, licence/attribution, canonical URL, evidence context), making the tool's scope unambiguous and distinguishing it from the sibling verify/evidence tools that serve a different stage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names when to use the tool ('Use when asked can I cite this source?, for licence and attribution, or for citation-ready provenance'). It also gives a pre-trust workflow (search_datasets -> verify_dataset -> get_provenance) and warns that this is not a freshness check, though it does not name alternative tools for freshness or licence search such as get_freshness_summary or find_by_licence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_datasetsFind Malaysian Public DataARead-onlyIdempotentInspect
Use for discovery only: find DataPulse's 418 Malaysian public datasets by topic, source, or licenceโfor example, 'Malaysian public data inflation', licence and attribution, or a government dataset source. Returns ranked matches with id, title, source, licence, published status, and score. This is not trust verification: a status is published pipeline context, not proof that a dataset is current or reliable. For 'is this dataset current?' or verify before relying on data, use search_datasets โ verify_dataset โ get_provenance.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum discovery matches to return; integer from 1 to 50, e.g. 10. | |
| query | Yes | Topic or task phrasing for Malaysian public-data discovery only, e.g. 'Malaysian public data inflation'; verify a result separately. | |
| source | No | Optional case-insensitive publisher/source filter, e.g. 'OpenDOSM'. | |
| licence | No | Optional exact licence name or supported alias for reuse discovery, e.g. 'CC BY 4.0'; this does not verify attribution compliance. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent safety, so the bar for added behavioral value is met by the description's caveat that 'a status is published pipeline context, not proof that a dataset is current or reliable.' It also discloses return fields and ranking, which is useful beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is 3 sentences and front-loads the key 'discovery only' purpose. The exampls in the first sentence are slightly extraneous but useful for grounding the query phrasing; overall no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with a rich schema and output schema, the description fully equips an agent: purpose, caveats, return content, and a reroute for verification. It even provides a compond tool chain, leaving no practical gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description recaps that query/source/licence are the search dimensions and gives examples, but does not add meaning beyond the detailed schema descriptions already present for each parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('find') and a precise resource ('DataPulse's 418 Malaysian public datasets') with explicit search dimensions: topic, source, or licence. It clearly separates discovery from trust verification, distinguishing itself from sibling tools like verify_dataset and get_provenance without needing to open their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use for discovery only' and states what the tool is not: 'This is not trust verification.' It gives a concrete routing rule for currentness/reliability checks: 'search_datasets โ verify_dataset โ get_provenance.' This is strong when-to-use versus when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trust_verdictAggregate a Published Trust VerdictARead-onlyIdempotentInspect
Return published attestation facts, the unsigned methodology-versioned trust score, numeric components, and component_availability reasons, plus existing health/trend/drift/reconciliation evidence for one canonical dataset id, e.g. 'fuelprice'. This tool does not re-probe or verify the signature; call verify_attestation separately.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes | Canonical dataset identifier to aggregate, e.g. 'fuelprice'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive, but the description adds valuable behavioral detail: the returned trust score is unsigned, the tool does not re-probe or verify signatures, and the evidence is existing rather than newly computed. This meaningfully exceeds what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two well-structured sentences: the first packs in the full return scope with front-loaded content, and the second covers the critical limitation and correct alternative. There is no filler, and every phrase adds decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one parameter, rich annotations, and an output schema, the description is fully sufficient. It covers what is returned, the unsigned nature of the score, the absence of verification, and the sibling to call instead. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter dataset_id is fully described in the schema with an example and minLength, so the schema carries the heavy lifting. The description contributes little beyond restating 'canonical dataset id' and the example, which is already present. Baseline 3 is appropriate given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb ('Return') and specifies the exact resource: published attestation facts, the unsigned methodology-versioned trust score, numeric components, component_availability reasons, and existing evidence for one canonical dataset id. It also explicitly distinguishes itself from verify_attestation by stating what it does not do, which helps an agent select it correctly among many siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use the tool: to aggregate existing published trust data for one canonical dataset id. It also provides an explicit when-not and alternative: 'This tool does not re-probe or verify the signature; call verify_attestation separately.' This is direct, actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
usage_summarySummarize Aggregate Tool UsageARead-onlyIdempotentInspect
Aggregate anonymous tool usage for an inclusive ISO date range, e.g. 2026-08-01 to 2026-08-07. Returns total_calls, by_outcome, by_tool, by_dataset, trust_distribution (per-status counts of cited datasets) for the inclusive range. Legacy identity fields are ignored.
| Name | Required | Description | Default |
|---|---|---|---|
| since | Yes | Inclusive ISO start date YYYY-MM-DD, e.g. '2026-08-01'. | |
| until | Yes | Inclusive ISO end date YYYY-MM-DD, e.g. '2026-08-07'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive, and the description adds useful behavioral context beyond those: results are anonymous, the date range is inclusive, and legacy identity fields are ignored. It also names the output fields, which orients the caller even though an output schema exists. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences convey the action, date scope, returned fields, and an important caveat. The key verb phrase is front-loaded, and every sentence earns its place without repeating annotations or schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter, read-only aggregate tool, the description is complete: parameters are fully documented, annotations cover safety behavior, an output schema exists, and the anonymous/legacy-identity caveat adds context not available elsewhere. An agent has everything needed to invoke and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents the two ISO date parameters with examples. The description reinforces that the range is inclusive but does not add meaningful parameter semantics beyond what the schema provides, so the high-coverage baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pairing: 'Aggregate anonymous tool usage' over an explicit inclusive ISO date range. It clearly distinguishes this aggregate analytics tool from the data-retrieval and verification siblings, and lists the returned aggregate fields so an agent understands exactly what the tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes clear context: this is the tool for aggregate, anonymous usage summaries over a date range. The phrases 'anonymous' and 'Legacy identity fields are ignored' impliedly warn against using it for per-identity or per-user analysis, though it does not explicitly name sibling alternatives or state when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_attestationVerify Signed Attestation ChainARead-onlyIdempotentInspect
Use to verify a signed published probe attestation after an evidence audit. Returns L1 signature, key, time, and chain-link checks; optional L2 replay of daily heads to a Git-tag anchor; and L3 scope, which requires verify_evidence for live transport. A valid signature proves attestation integrity and scope, not upstream semantic truth or currentness. For a deep audit use search_datasets โ get_evidence โ verify_evidence โ verify_attestation.
| Name | Required | Description | Default |
|---|---|---|---|
| reference | Yes | Dataset id or safe relative published digest reference for signed-attestation verification, e.g. 'fuelprice'. | |
| replay_chain | No | Replay signed daily heads to a Git-tag anchor for L2 verification, e.g. true for an auditor. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral detail beyond the readOnlyHint/idempotentHint annotations, explaining exactly what the verification proves and, importantly, what it does not prove. It also discloses the layered verification structure (L1/L2/L3) and the dependency on verify_evidence for live transport, giving agents a transparent picture of the tool's semantics and limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the main action, and every sentence provides distinct value: what it verifies, what it returns, what it does not prove, and how it fits into a broader audit flow. No filler or redundant restatement of the tool name exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a read-only verification tool, especially given the rich annotations and full parameter schema. It provides the invocation rationale, the pipeline context, the output categories, and the key caveats, leaving no critical gap for an agent deciding whether and how to call this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage for parameters is 100%, so the description need not repeat schema details. It adds useful context for replay_chain by describing it as 'optional L2 replay of daily heads to a Git-tag anchor,' which enriches the bare boolean schema. The reference parameter is adequately covered by the schema's examples and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as verifying a signed published probe attestation, with specific outputs (L1 signature, key, time, chain-link checks, optional L2 replay, L3 scope). It distinguishes itself from verify_evidence by explicitly noting that L3 scope requires verify_evidence for live transport, making the tool's role in the audit pipeline unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use context ('after an evidence audit') and a concrete deep-audit pipeline: search_datasets โ get_evidence โ verify_evidence โ verify_attestation. It also states a key exclusion: a valid signature does not prove upstream semantic truth or currentness, guiding agents away from using it for those purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_datasetVerify Dataset Before RelyingARead-onlyIdempotentInspect
This is the preferred single-call pre-trust check for 'is this dataset current?', stale, unknown-freshness, degraded, or browser-dependent questions, and whenever an agent must verify before relying on data. Returns dataset metadata, published evidence and fail-closed signed receipt verification with artifact references. It verifies published artifacts, not a live source check: you may infer whether their receipt verifies, but must not infer current upstream availability or semantic truth. Use search_datasets โ verify_dataset โ get_provenance.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes | Canonical dataset identifier for the published pre-trust receipt check, e.g. 'fuelprice'; this does not perform a live source fetch. | |
| include_proof_steps | No | Include bounded signed-receipt verifier diagnostics for an audit, e.g. false; the result still does not establish upstream semantic truth. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnly, idempotent, openWorld, non-destructive), the description discloses fail-closed receipt verification, artifact references, and the crucial limitation that it verifies published artifacts and not live upstream availability or semantic truth. It also states what inferences are permitted vs prohibited, which is substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus a pipeline. Each sentence carries essential information: scope of use, return contents, and a critical limitation. There is no filler or repetition of schema details, and the most important 'preferred pre-trust check' is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With output schema present, return values need not be spelled out. The description covers when to use, what it does, what it does not do, the allowed inferences, and the requested pipeline order. For a two-parameter tool with strong annotations, this is fully sufficient for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already fully documented in the schema. The description adds useful high-level context (single-call, published artifacts) but does not provide per-parameter meaning beyond what the schema already states, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('pre-trust check', 'verify before relying') and names the precise class of questions it answers: currency, staleness, unknown freshness, degraded, browser-dependent. It also distinguishes itself from a live source check and mentions the search/verify/provenance pipeline, making its role among siblings clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use language ('preferred single-call pre-trust check', 'whenever an agent must verify before relying on data') and a clear exclusion ('not a live source check'). The pipeline 'search_datasets โ verify_dataset โ get_provenance' gives the agent an explicit placement relative to siblings, so no inference is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_evidenceLive-check Published Transport EvidenceARead-onlyIdempotentInspect
Use when a fresh, rate-limited live-vs-published comparison is needed for a direct-access dataset, for example after asking whether a government dataset is reachable now. Performs a rate-limited live GET and returns comparable transport receipts plus a match, mismatch, unreachable, or not_verifiable verdict. This live check is an observation, not semantic truth: it does not recompute content dates, record counts, or shape fingerprints. Results are ephemeral and do not update published health artifacts. For a deep audit use search_datasets โ get_evidence โ verify_evidence โ verify_attestation.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes | Canonical direct-access dataset identifier for a rate-limited live transport observation, e.g. 'fuelprice'; browser-dependent sources cannot be fetched here. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description reinforces these by noting results are ephemeral, do not update artifacts, and are an observation rather than semantic truth. The rate-limited live GET behavior is also disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise but information-dense: it covers use case, behavior, limitations, and related workflow in three sentences. No irrelevant or redundant content; structure flows logically from when to use to what to expect.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description gives enough context about return contents (transport receipts plus verdict types) and explicitly states non-goals (no recomputation, no artifact updates). It also situates the tool within a broader audit workflow, making it complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single required parameter dataset_id is fully described in the schema with a clear meaning, example, and constraint (minLength=1). The description adds direct-access context, so the parameter semantics are complete beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: performing a live-vs-published comparison for a direct-access dataset and returning a verdict. It also distinguishes behavior from deeper audits by directing users to the search_datasets โ get_evidence โ verify_evidence โ verify_attestation path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool (fresh, rate-limited live-vs-published comparison; checking if a government dataset is reachable now) and what it does not do (recompute content dates, record counts, or shape fingerprints; update published health artifacts). Provides an alternative path for deeper audits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.12.0- Added
get_data_passport - Changed
get_evidence1 field changed- changed
Input schema / properties / dataset_id / descriptionPrevious value: -"Canonical dataset identifier for a deep receipt, e.g. 'fuelprice'."New value: +"Canonical dataset identifier for its complete published evidence receipt, e.g. 'fuelprice'; this tool does not fetch the live source."
- Changed
get_provenance1 field changed- changed
Input schema / properties / dataset_ids / descriptionPrevious value: -"JSON array of 1 to 50 canonical dataset IDs, e.g. ['fuelprice', 'pricecatcher']."New value: +"JSON array of 1 to 50 canonical dataset IDs for provenance and citation, e.g. ['fuelprice', 'pricecatcher']; this is not a live freshness check."
- Changed
search_datasets5 fields changed- changed
Input schema / properties / licence / descriptionPrevious value: -"Optional exact licence name or supported alias, e.g. 'CC BY 4.0'."New value: +"Optional exact licence name or supported alias for reuse discovery, e.g. 'CC BY 4.0'; this does not verify attribution compliance." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum ranked matches to return; integer from 1 to 50, e.g. 10."New value: +"Maximum discovery matches to return; integer from 1 to 50, e.g. 10." - changed
Input schema / properties / query / descriptionPrevious value: -"Free-text search terms; natural language is allowed, e.g. 'inflation cpi'."New value: +"Topic or task phrasing for Malaysian public-data discovery only, e.g. 'Malaysian public data inflation'; verify a result separately." - changed
Input schema / properties / query / examplesPrevious value: -[ - "inflation cpi" -]New value: +[ + "Malaysian public data inflation" +] - changed
Input schema / properties / source / descriptionPrevious value: -"Optional case-insensitive source-name substring, e.g. 'OpenDOSM'."New value: +"Optional case-insensitive publisher/source filter, e.g. 'OpenDOSM'."
- Changed
usage_summary2 fields changed- removed
Input schema / properties / buyer_idRemoved value: -{ - "description": "Buyer identifier, e.g. 'pro-default' or 'anonymous'.", - "examples": [ - "pro-default" - ], - "minLength": 1, - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "buyer_id", - "since", - "until" -]New value: +[ + "since", + "until" +]
- Changed
verify_attestation2 fields changed- changed
Input schema / properties / reference / descriptionPrevious value: -"Dataset id or relative digest reference, e.g. 'fuelprice'."New value: +"Dataset id or safe relative published digest reference for signed-attestation verification, e.g. 'fuelprice'." - changed
Input schema / properties / replay_chain / descriptionPrevious value: -"Replay daily heads to the newest tag anchor, e.g. true for an auditor."New value: +"Replay signed daily heads to a Git-tag anchor for L2 verification, e.g. true for an auditor."
- Changed
verify_dataset2 fields changed- changed
Input schema / properties / dataset_id / descriptionPrevious value: -"Canonical dataset identifier to verify before trust, e.g. 'fuelprice'."New value: +"Canonical dataset identifier for the published pre-trust receipt check, e.g. 'fuelprice'; this does not perform a live source fetch." - changed
Input schema / properties / include_proof_steps / descriptionPrevious value: -"Include bounded Cosign verifier output for audit steps, e.g. false."New value: +"Include bounded signed-receipt verifier diagnostics for an audit, e.g. false; the result still does not establish upstream semantic truth."
- Changed
verify_evidence1 field changed- changed
Input schema / properties / dataset_id / descriptionPrevious value: -"Canonical direct-access dataset identifier to re-fetch, e.g. 'fuelprice'."New value: +"Canonical direct-access dataset identifier for a rate-limited live transport observation, e.g. 'fuelprice'; browser-dependent sources cannot be fetched here."
18 tool updates
v1.0.2- Added
check_reconciliation - Added
find_anomalies - Added
find_by_licence - Added
find_deteriorating - Added
find_recovering - Added
find_schema_drift - Added
find_stale - Added
find_unreliable - Added
get_dataset - Added
get_evidence - Added
get_freshness_summary - Added
get_provenance - Added
search_datasets - Added
trust_verdict - Added
usage_summary - Added
verify_attestation - Added
verify_dataset - Added
verify_evidence
TDQS
Scored across 19 tools
Several tools overlap in surface: get_dataset, get_data_passport, get_provenance, trust_verdict, and verify_dataset all return dataset-level metadata or provenance-like facts, and the verify_dataset/verify_evidence/verify_attestation family requires careful reading. The descriptions are rich and provide usage guidance, so an agent can separate them with effort, but misselection risk is real.
Most tools follow a clear verb_noun snake_case pattern such as get_dataset, search_datasets, verify_evidence, and find_anomalies. Minor deviations include usage_summary and trust_verdict being noun phrases, plus check_reconciliation and find_by_licence breaking the dominant get/find/verify pattern.
19 tools is borderline heavy for a single MCP server. Each tool has a focused purpose, but the seven find_* health tools and the cluster of get_evidence/verify_evidence/verify_attestation/trust_verdict could likely be consolidated without losing meaningful capability.
The tool set covers the full trust-verification lifecycle: discovery, dataset detail, provenance, evidence audit, live verification, attestation verification, health trends, anomaly detection, and licence scoping. No obvious dead ends exist for the stated domain of assessing Malaysian public dataset freshness and reliability.
Maintenance
Related MCP Connectors
This MCP server provides seamless access to Malaysia's government open data, including datasets, wโฆ
data.gov.my / OpenDOSM (Department of Statistics Malaysia) โ official Malaysian open-data API.
data.gov.sg MCP โ Singapore open data + real-time environment/transport feeds
data.gov.uk MCP โ UK national open-data portal (CKAN API).
Related MCP Servers
- AlicenseAqualityDmaintenanceModel Context Protocol (MCP) server that provides weather forecast, warnings, water level associated with flood, and earthquake reports from Malaysia Government's Open API.41MIT
- 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.4911ISC
- AlicenseNot gradedqualityDmaintenance26 US federal data domains as 23 MCP tools. Ed25519 signed responses. Free, no API key.431MIT
- AlicenseNot gradedqualityCmaintenanceConnects to Malaysia's OpenDOSM open data API via Pipeworx, enabling access to official statistics through MCP tools or natural language queries.15MIT