Read-only discovery for 418 Malaysian public datasets with freshness, licence, and provenance.
io.github.r3dz4r/datapulse-my MCP Server
This MCP server provides read-only discovery for 389 Malaysian public datasets, including freshness, licence, and provenance. It is described as an open-data resource and is associated with a live dashboard at https://www.data-pulse.my.
π οΈ Key Features
Read-only discovery of datasets (389)
Dataset metadata includes freshness
Dataset metadata includes licence
Dataset metadata includes provenance
π Use Cases
Discovering Malaysian public datasets with provenance and licensing context
Data engineering workflows requiring dataset freshness and licence information
Dataset discovery for AI/LLM applications using public-data sources
β‘ Developer Benefits
Exposes dataset discovery via MCP (tool count: 18)
Supports integration with MCP-compatible agents (topics include mcp, ai-agent, llms-txt)
Includes an associated Colab workflow via the βtrust-layer-notebook.ipynbβ link
β οΈ Limitations
Read-only access; it is not positioned for dataset creation or updates
The provided description does not specify write operations, authentication, or query semantics
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.
Parameters4
query
string
required
Topic or task phrasing for Malaysian public-data discovery only, e.g. 'Malaysian public data inflation'; verify a result separately.
licence
any
optional
Optional exact licence name or supported alias for reuse discovery, e.g. 'CC BY 4.0'; this does not verify attribution compliance.
source
any
optional
Optional case-insensitive publisher/source filter, e.g. 'OpenDOSM'.
limit
integer
optional
Maximum discovery matches to return; integer from 1 to 50, e.g. 10.
Raw schema
{
"type": "object",
"properties": {
"query": {
"description": "Topic or task phrasing for Malaysian public-data discovery only, e.g. 'Malaysian public data inflation'; verify a result separately.",
"examples": [
"Malaysian public data inflation"
],
"minLength": 1,
"type": "string"
},
"licence": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional exact licence name or supported alias for reuse discovery, e.g. 'CC BY 4.0'; this does not verify attribution compliance.",
"examples": [
"CC BY 4.0",
"Open Government Licence (Malaysia)"
]
},
"source": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional case-insensitive publisher/source filter, e.g. 'OpenDOSM'.",
"examples": [
"OpenDOSM",
"data.gov.my",
"MET Malaysia"
]
},
"limit": {
"default": 10,
"description": "Maximum discovery matches to return; integer from 1 to 50, e.g. 10.",
"maximum": 50,
"minimum": 1,
"type": "integer"
}
},
"required": [
"query"
],
"additionalProperties": false
}
get_dataset
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.
Parameters1
dataset_id
string
required
Canonical dataset identifier, e.g. 'dosm_cpi_state'. See the registry catalogue for valid IDs.
Raw schema
{
"type": "object",
"properties": {
"dataset_id": {
"description": "Canonical dataset identifier, e.g. 'dosm_cpi_state'. See the registry catalogue for valid IDs.",
"examples": [
"dosm_cpi_state"
],
"minLength": 1,
"type": "string"
}
},
"required": [
"dataset_id"
],
"additionalProperties": false
}
get_data_passport
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.
Parameters1
dataset_id
string
required
Canonical dataset identifier for its published Passport v1, e.g. 'fuelprice'.
Raw schema
{
"type": "object",
"properties": {
"dataset_id": {
"description": "Canonical dataset identifier for its published Passport v1, e.g. 'fuelprice'.",
"examples": [
"fuelprice"
],
"minLength": 1,
"type": "string"
}
},
"required": [
"dataset_id"
],
"additionalProperties": false
}
find_stale
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.
Parameters1
max_age_hours
integer
optional
Maximum acceptable age of the latest health check in whole hours; non-negative integer, e.g. 72.
Raw schema
{
"type": "object",
"properties": {
"max_age_hours": {
"default": 24,
"description": "Maximum acceptable age of the latest health check in whole hours; non-negative integer, e.g. 72.",
"examples": [
24,
72
],
"minimum": 0,
"type": "integer"
}
},
"required": [],
"additionalProperties": false
}
find_anomalies
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.
Parameters3
limit
integer
optional
Maximum ranked anomalies to return; integer from 1 to 200, e.g. 50.
mode
any
optional
Optional exact detection mode; e.g. 'rolling_14d' or 'cadence_fallback'.
min_reliability
any
optional
Optional minimum publish-reliability grade; e.g. 'C' keeps A, B, and C and excludes insufficient data.
Raw schema
{
"type": "object",
"properties": {
"limit": {
"default": 50,
"description": "Maximum ranked anomalies to return; integer from 1 to 200, e.g. 50.",
"examples": [
10,
50
],
"maximum": 200,
"minimum": 1,
"type": "integer"
},
"mode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional exact detection mode; e.g. 'rolling_14d' or 'cadence_fallback'.",
"examples": [
"rolling_14d",
"cadence_fallback"
]
},
"min_reliability": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional minimum publish-reliability grade; e.g. 'C' keeps A, B, and C and excludes insufficient data.",
"examples": [
"A",
"C"
]
}
},
"required": [],
"additionalProperties": false
}
find_deteriorating
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.
Parameters2
limit
integer
optional
Maximum ranked deteriorating datasets to return; integer from 1 to 200, e.g. 50.
min_anomaly_rate
any
optional
Optional minimum percent of anomaly-evaluable history days, e.g. 25.0.
Return datasets whose published freshness trend is recovering, with the fastest staleness reductions first. Includes pipeline-computed trend and publish-reliability evidence.
Parameters1
limit
integer
optional
Maximum ranked recovering datasets to return; integer from 1 to 200, e.g. 50.
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.
Parameters2
limit
integer
optional
Maximum ranked unreliable datasets to return; integer from 1 to 200, e.g. 50.
at_or_below_grade
string
optional
Inclusive reliability threshold; e.g. 'C' returns grades C, D, and F.
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.
Parameters2
limit
integer
optional
Maximum ranked drift results to return; integer from 1 to 200, e.g. 50.
min_change_count
integer
optional
Minimum structural fingerprint or column-count transitions; integer from 0 to 100, e.g. 1.
Raw schema
{
"type": "object",
"properties": {
"limit": {
"default": 50,
"description": "Maximum ranked drift results to return; integer from 1 to 200, e.g. 50.",
"examples": [
10,
50
],
"maximum": 200,
"minimum": 1,
"type": "integer"
},
"min_change_count": {
"default": 0,
"description": "Minimum structural fingerprint or column-count transitions; integer from 0 to 100, e.g. 1.",
"examples": [
0,
1
],
"maximum": 100,
"minimum": 0,
"type": "integer"
}
},
"required": [],
"additionalProperties": false
}
check_reconciliation
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.
Parameters1
dataset_name
string
required
Dataset id or name to reconcile, e.g. 'interestrates' or 'Monthly Interest Rates'.
Raw schema
{
"type": "object",
"properties": {
"dataset_name": {
"description": "Dataset id or name to reconcile, e.g. 'interestrates' or 'Monthly Interest Rates'.",
"examples": [
"interestrates",
"Monthly Interest Rates"
],
"minLength": 1,
"type": "string"
}
},
"required": [
"dataset_name"
],
"additionalProperties": false
}
get_provenance
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.
Parameters1
dataset_ids
array
required
JSON array of 1 to 50 canonical dataset IDs for provenance and citation, e.g. ['fuelprice', 'pricecatcher']; this is not a live freshness check.
Raw schema
{
"type": "object",
"properties": {
"dataset_ids": {
"description": "JSON array of 1 to 50 canonical dataset IDs for provenance and citation, e.g. ['fuelprice', 'pricecatcher']; this is not a live freshness check.",
"examples": [
[
"fuelprice",
"pricecatcher"
]
],
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"type": "array"
}
},
"required": [
"dataset_ids"
],
"additionalProperties": false
}
get_evidence
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.
Parameters1
dataset_id
string
required
Canonical dataset identifier for its complete published evidence receipt, e.g. 'fuelprice'; this tool does not fetch the live source.
Raw schema
{
"type": "object",
"properties": {
"dataset_id": {
"description": "Canonical dataset identifier for its complete published evidence receipt, e.g. 'fuelprice'; this tool does not fetch the live source.",
"examples": [
"fuelprice"
],
"minLength": 1,
"type": "string"
}
},
"required": [
"dataset_id"
],
"additionalProperties": false
}
verify_dataset
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.
Parameters2
dataset_id
string
required
Canonical dataset identifier for the published pre-trust receipt check, e.g. 'fuelprice'; this does not perform a live source fetch.
include_proof_steps
boolean
optional
Include bounded signed-receipt verifier diagnostics for an audit, e.g. false; the result still does not establish upstream semantic truth.
Raw schema
{
"type": "object",
"properties": {
"dataset_id": {
"description": "Canonical dataset identifier for the published pre-trust receipt check, e.g. 'fuelprice'; this does not perform a live source fetch.",
"examples": [
"fuelprice"
],
"minLength": 1,
"type": "string"
},
"include_proof_steps": {
"default": false,
"description": "Include bounded signed-receipt verifier diagnostics for an audit, e.g. false; the result still does not establish upstream semantic truth.",
"examples": [
false,
true
],
"type": "boolean"
}
},
"required": [
"dataset_id"
],
"additionalProperties": false
}
get_freshness_summary
Return a freshness-at-a-glance summary of the published catalogue: fresh, aging, stale, and reference counts plus the latest health check time.
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.
Parameters1
dataset_id
string
required
Canonical direct-access dataset identifier for a rate-limited live transport observation, e.g. 'fuelprice'; browser-dependent sources cannot be fetched here.
Raw schema
{
"type": "object",
"properties": {
"dataset_id": {
"description": "Canonical direct-access dataset identifier for a rate-limited live transport observation, e.g. 'fuelprice'; browser-dependent sources cannot be fetched here.",
"examples": [
"fuelprice"
],
"minLength": 1,
"type": "string"
}
},
"required": [
"dataset_id"
],
"additionalProperties": false
}
trust_verdict
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.
Parameters1
dataset_id
string
required
Canonical dataset identifier to aggregate, e.g. 'fuelprice'.
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.
Parameters2
reference
string
required
Dataset id or safe relative published digest reference for signed-attestation verification, e.g. 'fuelprice'.
replay_chain
boolean
optional
Replay signed daily heads to a Git-tag anchor for L2 verification, e.g. true for an auditor.
Raw schema
{
"type": "object",
"properties": {
"reference": {
"description": "Dataset id or safe relative published digest reference for signed-attestation verification, e.g. 'fuelprice'.",
"examples": [
"fuelprice",
"attestations/2026-08-15/fuelprice.json"
],
"minLength": 1,
"type": "string"
},
"replay_chain": {
"default": false,
"description": "Replay signed daily heads to a Git-tag anchor for L2 verification, e.g. true for an auditor.",
"examples": [
false,
true
],
"type": "boolean"
}
},
"required": [
"reference"
],
"additionalProperties": false
}
find_by_licence
Return all datasets with the given licence, summarised. Use to enumerate what's available under a specific licence for compliance/reuse scoping.
Parameters1
licence
string
required
Exact licence name or supported alias, e.g. 'Creative Commons Attribution 4.0'.
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`, and `trust_distribution` (counts of returned trust verdicts by published score band: 90-100, 75-89, 50-74, 25-49, 0-24) for the inclusive range. Legacy identity fields are ignored.
Parameters2
since
string
required
Inclusive ISO start date YYYY-MM-DD, e.g. '2026-08-01'.
until
string
required
Inclusive ISO end date YYYY-MM-DD, e.g. '2026-08-07'.
Raw schema
{
"type": "object",
"properties": {
"since": {
"description": "Inclusive ISO start date YYYY-MM-DD, e.g. '2026-08-01'.",
"examples": [
"2026-08-01"
],
"type": "string"
},
"until": {
"description": "Inclusive ISO end date YYYY-MM-DD, e.g. '2026-08-07'.",
"examples": [
"2026-08-07"
],
"type": "string"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
π€ 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.
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
**418 official datasets**,
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.
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
labelled unknown-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
python3 scripts/verify_external.py
Source of record
The served observation byte-matches the versioned Git source
python3 scripts/verify_external.py
Temporal witness
The health statement carries a Rekor/Sigstore public-log inclusion proof
python3 scripts/verify_external.py
Run it yourself, from anywhere, with no checkout and no DataPulse code:
scripts/observation_verify.py verifies receipt identity, signature, key
registry validity, and any available chain linkage from local files. It makes
no network calls in any mode. Supplying --health <artifact> additionally
reproduces the normalized artifact digest and re-derives its dataset and
freshness-status claims: only health_binding: checked and
artifact_claims: verified attest those claims. Without --health, the report
explicitly says artifact_claims: NOT verified; use
--require-health-binding when that incomplete result must fail.
For receipts with a signed <commit>@<path> artifact locator, pass
--repo owner/name to print the corresponding immutable raw-GitHub URL. The
repository is supplied, never guessed or hardcoded. Fetch that URL separately,
then give the saved file to --health; the URL is a discovery aid, not proof
until the local digest and claims check succeeds.
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.
Subscribe:RSS feed β get notified when dataset health changes.
Browser-dependent datasets
The current health summary identifies 5 browser-dependent sources (1.2% of the catalogue) that require a real browser to probe because their source pages render client-side JavaScript.
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 the CAMOFOX_BASE_URL environment
variable; nothing in this repo encodes a public IP.
Set CAMOFOX_BASE_URL to that address.
Restart the timer with systemctl restart datapulse-health.timer.
Without Camofox, these 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 (Last-Modified, parseable content date, or declared policy) β never a fabricated green checkmark. A series that stopped publishing is discontinued (a publisher decision, frozen data), not a freshness failure.
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 datapulse.json β .datasets[].licence.
Freshness cadence
Each dataset is probed on its own tiered schedule (5-minute timer, cadence-aware) β daily references, weekly fuel prices, monthly surveys, etc. Always with the human-readable steward and a stable custodian ID for publisher provenance.
Provenance
Stable custodian per dataset; signed probe attestations per observation
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 with bash scripts/audit_mcpgrade.sh (pinned version, writes artifacts/mcpgrade/). The canonical tool count lives in mcp.json.
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
418 official datasets across 44 publishers, including 30 GTFS transit feeds. Browse the published reports for plain-language health assessments, or use datapulse.json as the machine-readable index of every source, licence, health-report path, and declared refresh cadence.
Current coverage
Declared refresh cadences: annual (144); monthly (119); daily (48); as-required (35); quarterly (35); 30 seconds (14); biennial to triennial (survey years) (11); hourly (4); daily (weekdays) (2); weekly (2); daily (weekdays, 0900 MYT) (1); daily (weekdays, 1130 MYT) (1); daily (weekdays, 1200 MYT) (1); daily (weekdays, 1700 MYT) (1). Per-dataset cadence remains available in datapulse.json and each published health report.
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. Non-GTFS datasets also have matching machine-readable report
envelopes under data/json/; the 30 GTFS transit feeds intentionally do not,
and instead publish their health reports and GTFS samples.
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.timer wakes every 5 minutes and runs only the
datasets whose cadence tier is due.
GitHub Actions performs a full weekly probe as a fallback and republishes the
generated health, badge, feed, README, catalog snapshot, and delta artifacts.
RSS feed β available.
Status badges β available.
More datasets β planned.
Adopt a dataset
Know a Malaysian public dataset that deserves dependable health metadata?
Adopt it: verify its source and licence, document its schema and quirks, and
submit a health report. See CONTRIBUTING.md for the expected
three-file contribution model.
New contributors can start with the repository's
Good first issues
or propose a dataset through the GitHub issue forms. Maintainers use
good first issue (yellow), adopt-a-dataset (blue), freshness-check
(blue), bug (red), documentation (blue), question (purple), and
wontfix (gray) to route contributions.
Licence
DataPulse 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.