{
  "$schema": "https://data-pulse.my/mcp.schema.json",
  "schema": "datapulse/v1/mcp-advertisement",
  "mcp_version": "2026-07-28",
  "server": {
    "name": "DataPulse MY",
    "version": "4.0.0b3",
    "source_commit_sha": "669668c147a4ac431a9e3bf17eec82162bc3b4a2",
    "source_commit_date": "2026-08-16",
    "description": "Read-only access to DataPulse MY's Malaysian public dataset catalogue (389 datasets, 10-status health taxonomy, licence/attribution metadata).",
    "vendor": "DataPulse MY (open source)",
    "homepage": "https://data-pulse.my/",
    "repository": "https://github.com/r3dz4r/datapulse-my"
  },
  "endpoint": {
    "url": "https://mcp.data-pulse.my/mcp",
    "transport": "streamable-http",
    "method": "POST",
    "auth_required": false
  },
  "taxonomy": [
    "fresh",
    "aging",
    "stale",
    "discontinued",
    "degraded",
    "browser-dependent",
    "unreachable",
    "unknown",
    "unknown-freshness",
    "reference"
  ],
  "tools": [
    {
      "name": "search_datasets",
      "description": "Search DataPulse MY's 389 Malaysian public datasets by natural-language query. Filter by licence (e.g. 'CC BY 4.0', 'Open Government Licence (Malaysia)') or source ('OpenDOSM', 'data.gov.my', 'MET Malaysia', etc.). Returns ranked matches: id, title, source, licence, status, score. Use when an agent needs to find datasets covering a topic, by an agency, or under a specific licence.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "query": {
            "description": "Free-text search terms; natural language is allowed, e.g. 'inflation cpi'.",
            "examples": [
              "inflation cpi"
            ],
            "minLength": 1,
            "type": "string"
          },
          "licence": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional exact licence name or supported alias, e.g. 'CC BY 4.0'.",
            "examples": [
              "CC BY 4.0",
              "Open Government Licence (Malaysia)"
            ]
          },
          "source": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional case-insensitive source-name substring, e.g. 'OpenDOSM'.",
            "examples": [
              "OpenDOSM",
              "data.gov.my",
              "MET Malaysia"
            ]
          },
          "limit": {
            "default": 10,
            "description": "Maximum ranked matches to return; integer from 1 to 50, e.g. 10.",
            "maximum": 50,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "get_dataset",
      "description": "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.",
      "inputSchema": {
        "additionalProperties": false,
        "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"
        ],
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "find_stale",
      "description": "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.",
      "inputSchema": {
        "additionalProperties": false,
        "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"
          }
        },
        "type": "object",
        "required": []
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "find_anomalies",
      "description": "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.",
      "inputSchema": {
        "additionalProperties": false,
        "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"
            ]
          }
        },
        "type": "object",
        "required": []
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "find_deteriorating",
      "description": "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.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "limit": {
            "default": 50,
            "description": "Maximum ranked deteriorating datasets to return; integer from 1 to 200, e.g. 50.",
            "examples": [
              10,
              50
            ],
            "maximum": 200,
            "minimum": 1,
            "type": "integer"
          },
          "min_anomaly_rate": {
            "anyOf": [
              {
                "maximum": 100,
                "minimum": 0,
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional minimum percent of anomaly-evaluable history days, e.g. 25.0.",
            "examples": [
              25.0,
              50.0
            ]
          }
        },
        "type": "object",
        "required": []
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "find_recovering",
      "description": "Return datasets whose published freshness trend is recovering, with the fastest staleness reductions first. Includes pipeline-computed trend and publish-reliability evidence.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "limit": {
            "default": 50,
            "description": "Maximum ranked recovering datasets to return; integer from 1 to 200, e.g. 50.",
            "examples": [
              10,
              50
            ],
            "maximum": 200,
            "minimum": 1,
            "type": "integer"
          }
        },
        "type": "object",
        "required": []
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "find_unreliable",
      "description": "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.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "limit": {
            "default": 50,
            "description": "Maximum ranked unreliable datasets to return; integer from 1 to 200, e.g. 50.",
            "examples": [
              10,
              50
            ],
            "maximum": 200,
            "minimum": 1,
            "type": "integer"
          },
          "at_or_below_grade": {
            "default": "C",
            "description": "Inclusive reliability threshold; e.g. 'C' returns grades C, D, and F.",
            "examples": [
              "C",
              "F"
            ],
            "type": "string"
          }
        },
        "type": "object",
        "required": []
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "find_schema_drift",
      "description": "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.",
      "inputSchema": {
        "additionalProperties": false,
        "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"
          }
        },
        "type": "object",
        "required": []
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "check_reconciliation",
      "description": "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.",
      "inputSchema": {
        "additionalProperties": false,
        "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"
        ],
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "get_provenance",
      "description": "Return citation-ready provenance metadata for the listed dataset ids, plus compact pipeline-published evidence receipts: row probe time, HTTP status, request URL, access dependency, freshness source, content date, record count, shape fingerprint, anomaly flag, and status. Use when an agent must cite data and show the evidence behind the trust claim without recomputing it.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "dataset_ids": {
            "description": "JSON array of 1 to 50 canonical dataset IDs, e.g. ['fuelprice', 'pricecatcher'].",
            "examples": [
              [
                "fuelprice",
                "pricecatcher"
              ]
            ],
            "items": {
              "type": "string"
            },
            "maxItems": 50,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "dataset_ids"
        ],
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "get_evidence",
      "description": "Return the complete pipeline-published evidence receipt for one dataset id, including probe time, transport, access dependency, freshness, record-count, shape, tolerance, status, and anomaly fields. Use for a deep audit, e.g. get_evidence('fuelprice'); values are presented without MCP-side recomputation.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "dataset_id": {
            "description": "Canonical dataset identifier for a deep receipt, e.g. 'fuelprice'.",
            "examples": [
              "fuelprice"
            ],
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "dataset_id"
        ],
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "verify_evidence",
      "description": "Perform a rate-limited live streamed GET for one direct-access dataset and compare transport receipts with the latest published evidence, e.g. verify_evidence('fuelprice'). Content dates, row counts, and shape fingerprints remain pipeline-only and are explicitly reported as unverified; results are ephemeral and never update health artifacts. Returns a dict with transport receipt fields and a `verdict` for downstream trust checks without re-fetching.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "dataset_id": {
            "description": "Canonical direct-access dataset identifier to re-fetch, e.g. 'fuelprice'.",
            "examples": [
              "fuelprice"
            ],
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "dataset_id"
        ],
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "trust_verdict",
      "description": "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.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "dataset_id": {
            "description": "Canonical dataset identifier to aggregate, e.g. 'fuelprice'.",
            "examples": [
              "fuelprice"
            ],
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "dataset_id"
        ],
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "verify_attestation",
      "description": "Verify a published Ed25519 probe attestation by canonical dataset id or safe relative digest reference, e.g. 'fuelprice' or 'attestations/2026-08-15/fuelprice.json'. L1 checks signature/key validity; optional L2 replays daily heads to a Git-tag anchor; L3 is provided by verify_evidence. Returns `levels.L1.signature_valid` and `levels.L2.satisfied` for signature and replay status.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "reference": {
            "description": "Dataset id or relative digest reference, e.g. 'fuelprice'.",
            "examples": [
              "fuelprice",
              "attestations/2026-08-15/fuelprice.json"
            ],
            "minLength": 1,
            "type": "string"
          },
          "replay_chain": {
            "default": false,
            "description": "Replay daily heads to the newest tag anchor, e.g. true for an auditor.",
            "examples": [
              false,
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "reference"
        ],
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "find_by_licence",
      "description": "Return all datasets with the given licence, summarised. Use to enumerate what's available under a specific licence for compliance/reuse scoping.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "licence": {
            "description": "Exact licence name or supported alias, e.g. 'Creative Commons Attribution 4.0'.",
            "examples": [
              "Creative Commons Attribution 4.0",
              "CC BY 4.0",
              "OGL"
            ],
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "licence"
        ],
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "usage_summary",
      "description": "Aggregate one buyer's audit-ledger usage for an inclusive ISO date range, e.g. 2026-08-01 to 2026-08-07. Returns `total_calls`, `by_tool`, `by_dataset`, `trust_distribution` (per-status counts of cited datasets) for the inclusive range.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "buyer_id": {
            "description": "Buyer identifier, e.g. 'pro-default' or 'anonymous'.",
            "examples": [
              "pro-default"
            ],
            "minLength": 1,
            "type": "string"
          },
          "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": [
          "buyer_id",
          "since",
          "until"
        ],
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    }
  ],
  "resources": [
    {
      "uri": "datapulse://index",
      "name": "dataset_index",
      "description": "Read first; lightweight list of all DataPulse MY dataset ids with current status, title, source, licence, and namespace.",
      "mimeType": "application/json"
    },
    {
      "uri": "datapulse://anomalies",
      "name": "anomaly_resource",
      "description": "Datasets flagged by the latest published anomaly detection, ranked by severity with pipeline-computed evidence.",
      "mimeType": "application/json"
    },
    {
      "uri": "datapulse://trends",
      "name": "trend_resource",
      "description": "Published per-dataset freshness trends and publish-reliability evidence, including methodology and aggregate counts.",
      "mimeType": "application/json"
    },
    {
      "uri": "datapulse://reliability",
      "name": "reliability_summary",
      "description": "Live count of DataPulse MY datasets by evaluated publish-reliability grade; reliability is timeliness, not uptime.",
      "mimeType": "application/json"
    },
    {
      "uri": "datapulse://drift",
      "name": "drift_resource",
      "description": "Published per-dataset schema and record-count drift evidence, including methodology and aggregate verdict counts.",
      "mimeType": "application/json"
    },
    {
      "uri": "datapulse://reconciliation",
      "name": "reconciliation_resource",
      "description": "Published cross-source reconciliation groups with pairwise count, date, status, tolerance, and verdict evidence.",
      "mimeType": "application/json"
    },
    {
      "uri": "datapulse://attestations",
      "name": "attestation_resource",
      "description": "Latest signed probe attestation index and daily chain head.",
      "mimeType": "application/json"
    },
    {
      "uri": "datapulse://licences",
      "name": "licence_summary",
      "description": "Live count of DataPulse MY datasets grouped by licence.",
      "mimeType": "application/json"
    }
  ],
  "resource_templates": [
    {
      "uriTemplate": "datapulse://{dataset_id}",
      "name": "dataset_resource",
      "description": "Full published manifest entry for one exact DataPulse MY dataset id.",
      "mimeType": "application/json"
    }
  ]
}
