Open-source trust & interoperability layer for Malaysian public data: freshness monitoring, schema validation, and health reports for official datasets.
Drift inferred · capture-to-capture
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
- HIGH code analysis flagged dynamic code execution in r3dz4r/datapulse-my
transport streamable-http · http
verified
reported
listed in the official MCP registry counts 18 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
_check_reconciliation_tool
-
_find_anomalies_tool
-
_find_deteriorating_tool
-
_find_recovering_tool
-
_find_schema_drift_tool
-
_find_stale_tool
-
_find_unreliable_tool
-
_get_evidence_tool
-
_get_freshness_summary_tool
-
_trust_verdict_tool
-
_verify_attestation_tool
-
_verify_dataset_tool
-
_verify_evidence_tool
-
find_by_licence
-
get_data_passport
-
get_dataset
-
get_provenance
-
search_datasets
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 8f132ad · analyzer v33 · 15m ago
skills & prompt files 6
- agent-rules r3dz4r-datapulse-my-8f132ad/.attestations/AGENTS.md
- agent-rules r3dz4r-datapulse-my-8f132ad/AGENTS.md
- agent-rules r3dz4r-datapulse-my-8f132ad/CLAUDE.md
- agent-rules r3dz4r-datapulse-my-8f132ad/docs/AGENTS.md
- agent-rules r3dz4r-datapulse-my-8f132ad/mcp/AGENTS.md
- agent-rules r3dz4r-datapulse-my-8f132ad/scripts/AGENTS.md
danger signals2
- dynamic code execution __import__ sink r3dz4r-datapulse-my-8f132ad/scripts/gen_landing_page.py :443
root = Path(__import__("os").environ.get("DATAPULSE_REPO_ROOT", ROOT)).resolve() - dynamic code execution eval()/exec() r3dz4r-datapulse-my-8f132ad/scripts/tests/test_notebook_examples.py :45
exec(load_code_cell(6), namespace)
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 306
filesystem 209
- fs r3dz4r-datapulse-my-8f132ad/api/config.py :6
from pathlib import Path - fs r3dz4r-datapulse-my-8f132ad/api/keys.py :5
from pathlib import Path - fs r3dz4r-datapulse-my-8f132ad/api/server.py :13
from pathlib import Path - fs r3dz4r-datapulse-my-8f132ad/mcp/agent_task_suite.py :17
from pathlib import Path - fs r3dz4r-datapulse-my-8f132ad/mcp/answerability_benchmark.py :14
from pathlib import Path - fs r3dz4r-datapulse-my-8f132ad/mcp/score_agent_trace.py :9
from pathlib import Path - fs r3dz4r-datapulse-my-8f132ad/mcp/server.py :14
import shutil - fs (weak) r3dz4r-datapulse-my-8f132ad/mcp/tests/test_agent_task_suite.py :7
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/mcp/tests/test_mcp_answerability_benchmark.py :7
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/mcp/tests/test_mcp_citation_resource.py :10
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/mcp/tests/test_mcp_data_passport.py :6
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/mcp/tests/test_mcp_freshness_summary.py :7
from pathlib import Path
show 28 more
- fs (weak) r3dz4r-datapulse-my-8f132ad/mcp/tests/test_mcp_source_stamp.py :7
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/mcp/tests/test_mcp_three_call_path.py :6
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/mcp/tests/test_mcp_verify_dataset.py :10
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/mcp/tests/test_score_agent_trace.py :8
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/mcp/tests/test_server.py :17
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/mcp/tests/test_verification_benchmark.py :6
from pathlib import Path - fs r3dz4r-datapulse-my-8f132ad/mcp/verification_benchmark.py :12
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/_detect_unknown_freshness.py :8
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/api_keys.py :6
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/audit_freshness_semantics.py :11
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/audit_mcpgrade_parse.py :11
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/bump_mcp_source_version.py :10
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/check.py :9
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/check_heartbeat.py :11
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/check_url_drift.py :10
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/compare_health.py :10
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/embed_dashboard_data.py :14
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/evidence_graph.py :10
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/fact_lint.py :11
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_ai_catalog.py :13
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_anomaly.py :11
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_api_reference.py :8
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_as_of.py :11
import shutil - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_attestations.py :6
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_catalog_graph.py :15
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_catalog_snapshot.py :11
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_dashboard_filters.py :7
from pathlib import Path - fs (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_dashboard_sections.py :14
from pathlib import Path
169 more not shown — this panel samples each group; the count above is the real total.
shell / exec 101
- shell r3dz4r-datapulse-my-8f132ad/mcp/server.py :15
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/mcp/tests/test_server.py :13
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/_detect_unknown_freshness.py :6
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/bump_mcp_source_version.py :8
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/check.py :7
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_ai_catalog.py :12
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_as_of.py :12
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_attestations.py :85
anchors = {}; result = subprocess.run(["git", "tag", "--list", "v[0-9]*"], cwd=root, text=True, capture_output=True) - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_health_methodology.py :8
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_health_methodology_html.py :10
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_trust_snapshot.py :11
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/probe_gtfs.py :11
import subprocess
show 28 more
- shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/reconcile_registry_status.py :22
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/release_identity.py :14
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/run_health_canary.py :9
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/sign_per_dataset_receipts.py :10
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/sigstore_rekor_publisher.py :20
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/generator_harness.py :8
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_attestation_rekor_wiring.py :8
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_audit_freshness_semantics.py :6
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_audit_mcpgrade.py :6
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_badge_generation.py :4
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_cadence_classification.py :7
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_cadence_lint.py :3
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_classify_change.py :5
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_dashboard.py :3
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_datacontract_validation.py :7
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_dataset_deltas.py :7
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_deploy_cloudflare_pages_contract.py :9
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_discontinued_status.py :7
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_drift.py :7
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_embed_dashboard_data_shell.py :7
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_evidence_coverage.py :6
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_extract_content_freshness.py :2
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_extract_parquet_freshness.py :2
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_extract_pdf_freshness.py :2
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_fact_lint_claims.py :9
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_gen_ai_catalog.py :6
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_gen_as_of.py :5
import subprocess - shell (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_gen_data_reports.py :8
import subprocess
61 more not shown — this panel samples each group; the count above is the real total.
network 35
- net r3dz4r-datapulse-my-8f132ad/api/server.py :15
from urllib.parse import parse_qs, urlparse - net r3dz4r-datapulse-my-8f132ad/mcp/server.py :24
from urllib.parse import urljoin, urlsplit - net (weak) r3dz4r-datapulse-my-8f132ad/mcp/tests/test_server.py :12
import httpx - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/_detect_unknown_freshness.py :9
from urllib.parse import parse_qs, urlsplit - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/fact_lint.py :13
from urllib.parse import urlparse - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_dashboard_sections.py :12
import urllib.error - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_json_envelope.py :15
import urllib.request - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_landing_page.py :13
from urllib.parse import urlsplit - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_reconciliation.py :17
from urllib.parse import parse_qsl, urlencode, urlsplit, urlunsplit - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_record_evidence.py :21
import httpx - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/gen_register_page.py :14
from urllib.parse import urlsplit - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/observation_pilot.py :83
from urllib.error import HTTPError, URLError
show 23 more
- net (weak) r3dz4r-datapulse-my-8f132ad/scripts/observation_receipt.py :44
import socket - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/probe_arcgis.py :10
import socket - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/public_surface_generation.py :13
from urllib.parse import urlsplit - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/publish_health_index.py :26
from urllib.parse import quote, urlsplit - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/reconcile_registry_status.py :26
from urllib.error import HTTPError, URLError - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/rekor_consistency_proxy.py :14
from urllib.error import HTTPError, URLError - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/sigstore_rekor_publisher.py :25
from urllib.parse import urlsplit - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/st_energy_adapter.py :15
from urllib.parse import urlencode, urljoin, urlparse - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/fixtures/generator/python_release/mcp/server.py :13
import httpx - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_gen_json_envelope.py :199
monkeypatch.setattr(envelope.urllib.request, "urlopen", urlopen) - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_mcp_source_sync.py :9
import socket - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_notebook_examples.py :6
import requests - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_observation_receipt.py :15
import socket - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_rekor_consistency_proxy.py :9
from urllib.error import HTTPError - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/tests/test_verify_local_public_parity.py :8
from urllib.error import HTTPError, URLError - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/verify_ai_catalog.py :12
from urllib.parse import urlparse - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/verify_external.py :17
from urllib.error import HTTPError, URLError - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/verify_local_public_parity.py :16
from urllib.error import HTTPError, URLError - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/verify_mcp_deployment.py :12
from urllib.error import HTTPError, URLError - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/verify_registry_distribution.py :21
from urllib.error import HTTPError, URLError - net (weak) r3dz4r-datapulse-my-8f132ad/scripts/verify_svg_namespace.py :10
from urllib.parse import urlparse - net r3dz4r-datapulse-my-8f132ad/sg/probe_sg_datagov.py :16
import httpx - net (weak) r3dz4r-datapulse-my-8f132ad/sg/tests/test_probe_sg_datagov.py :8
import httpx
secrets 1
- secrets r3dz4r-datapulse-my-8f132ad/sg/probe_sg_datagov.py :58
if api_key := os.getenv("SG_DATAGOV_API_KEY"):
database 2
- db (weak) r3dz4r-datapulse-my-8f132ad/scripts/observation_pilot.py :76
import sqlite3 - db (weak) r3dz4r-datapulse-my-8f132ad/scripts/observation_store.py :26
import sqlite3
tool registrations 18
- search_datasets r3dz4r-datapulse-my-8f132ad/mcp/server.py :897
- get_dataset r3dz4r-datapulse-my-8f132ad/mcp/server.py :986
- get_data_passport r3dz4r-datapulse-my-8f132ad/mcp/server.py :1064
- _find_stale_tool r3dz4r-datapulse-my-8f132ad/mcp/server.py :1182
- _find_anomalies_tool r3dz4r-datapulse-my-8f132ad/mcp/server.py :1325
- _find_deteriorating_tool r3dz4r-datapulse-my-8f132ad/mcp/server.py :1424
- _find_recovering_tool r3dz4r-datapulse-my-8f132ad/mcp/server.py :1452
- _find_unreliable_tool r3dz4r-datapulse-my-8f132ad/mcp/server.py :1547
- _find_schema_drift_tool r3dz4r-datapulse-my-8f132ad/mcp/server.py :1591
- _check_reconciliation_tool r3dz4r-datapulse-my-8f132ad/mcp/server.py :1638
- get_provenance r3dz4r-datapulse-my-8f132ad/mcp/server.py :1641
- _get_evidence_tool r3dz4r-datapulse-my-8f132ad/mcp/server.py :1740
show 6 more
- _verify_dataset_tool r3dz4r-datapulse-my-8f132ad/mcp/server.py :1879
- _get_freshness_summary_tool r3dz4r-datapulse-my-8f132ad/mcp/server.py :1909
- _verify_evidence_tool r3dz4r-datapulse-my-8f132ad/mcp/server.py :2023
- _trust_verdict_tool r3dz4r-datapulse-my-8f132ad/mcp/server.py :2073
- _verify_attestation_tool r3dz4r-datapulse-my-8f132ad/mcp/server.py :2149
- find_by_licence r3dz4r-datapulse-my-8f132ad/mcp/server.py :2152
declared dependencies 4
- gtfs-realtime-bindings@==2.2.0
- httpx@==0.28.1
- pyarrow@>=15.0.0,<20.0.0
- pdfplumber@>=0.10,<1.0