Skip to main content

MCP server for Philippine government data — earthquakes, weather, typhoons, procurement, population, air quality

Project description

ph-civic-data-mcp

The first MCP server for Philippine government data — earthquakes, weather, typhoons, procurement, population, and air quality — in your AI agent.

PyPI Python 3.11+ License: MIT

ph-civic-data-mcp is a zero-cost, stdio-transport MCP server that exposes live data from PHIVOLCS, PAGASA, PhilGEPS, PSA, and AQICN/EMB as tools that Claude Desktop, Claude Code, Cursor, or any MCP-compatible client can call directly.

Demo

Every GIF below is a real VHS recording of docs/live_demo.py — it spawns uvx ph-civic-data-mcp from this PyPI release and calls each tool over the real MCP stdio protocol. The panels you see contain the actual JSON returned by the server. Nothing is staged.

A grand tour hitting 8 tools across all 5 sources in one session:

grand tour

Per-source walkthroughs below. To reproduce any of them locally: uv run python docs/live_demo_single.py <suite>.

Why this exists

Philippine civic-data portals publish open data, but each in its own schema — scraped HTML tables, PXWeb JSON, undocumented APIs. Nothing ties them together for an AI agent. This server does.

Zero prior art on GitHub or PyPI as of April 2026. Closest: panukatan/lindol (R, PHIVOLCS only), pagasa-parser (JS, PAGASA only).

Install

uvx ph-civic-data-mcp

Or via pip:

pip install ph-civic-data-mcp

Setup

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "ph-civic-data": {
      "command": "uvx",
      "args": ["ph-civic-data-mcp"],
      "env": {
        "AQICN_TOKEN": "your_free_token_from_aqicn.org",
        "PAGASA_API_TOKEN": "optional_pagasa_token"
      }
    }
  }
}

Claude Code

Add to .claude/settings.json:

{
  "mcpServers": {
    "ph-civic-data": {
      "command": "uvx",
      "args": ["ph-civic-data-mcp"],
      "env": {
        "AQICN_TOKEN": "your_token"
      }
    }
  }
}

Or install via the Claude Code CLI:

claude mcp add ph-civic-data -- uvx ph-civic-data-mcp

Cursor, Zed, other MCP clients

Any client that supports the stdio MCP transport works. Point the command at uvx ph-civic-data-mcp and pass AQICN_TOKEN as env.

What you can ask

After setup, ask your agent:

  • "What earthquakes happened in the Philippines in the last 24 hours?"
  • "Is Taal volcano active right now?"
  • "What's the 3-day weather forecast for Quezon City?"
  • "Are there active typhoons in the Philippines right now?"
  • "Search PhilGEPS for flood control contracts."
  • "What is the population of Region VII based on the PSA?"
  • "What is the poverty incidence in the Bicol Region?"
  • "What is the air quality in Manila right now?"
  • "Give me a multi-hazard risk profile for Leyte."

Per-source demos

PHIVOLCS — earthquakes + volcano alert levels

phivolcs

PAGASA — weather forecast + typhoon tracking

pagasa

PhilGEPS — procurement search + aggregation

philgeps

PSA — population (2020 Census) + poverty (2023 Full-Year)

psa

AQICN — real-time air quality

aqicn

Cross-source — parallel multi-hazard risk profile

cross-source

How the demos are produced

docs/live_demo.py + docs/live_demo_single.py open an MCP StdioTransport pointing at uvx ph-civic-data-mcp (which resolves to this PyPI release), call the tools, and render the responses with Rich (panels, tables, syntax-highlighted JSON, live spinners). vhs drives a real terminal and records the session. Tapes are committed under docs/*.tape.

Data sources

Source Data Update frequency Auth
PHIVOLCS Earthquakes, bulletins, volcano alerts 5 min (earthquakes), 30 min (volcanoes) None
PAGASA 10-day weather, active typhoons, alerts Hourly Optional PAGASA_API_TOKEN
Open-Meteo Weather fallback when PAGASA token absent Hourly None
PhilGEPS Government procurement notices (latest ~100) 6 h (cached) None
PSA OpenSTAT Population (2020 Census), poverty (2023) Periodic None
AQICN Real-time air quality for PH cities 15 min Required AQICN_TOKEN (free)

All tools

Tool Description Key params
get_latest_earthquakes Recent PH earthquakes min_magnitude, limit, region
get_earthquake_bulletin Full PHIVOLCS bulletin for one event bulletin_url
get_volcano_status Alert level per monitored PH volcano volcano_name
get_weather_forecast 1–10 day forecast (PAGASA or Open-Meteo) location, days
get_active_typhoons Active tropical cyclones in/near PAR
get_weather_alerts Active PAGASA warnings region
search_procurement Keyword search on PhilGEPS notices keyword, agency, region, date_from/to, limit
get_procurement_summary Aggregate procurement stats agency, region, year
get_population_stats 2020 Census population region
get_poverty_stats 2023 Full-Year poverty incidence region
get_air_quality Real-time AQI + pollutants city
assess_area_risk Multi-hazard profile (parallel PHIVOLCS + PAGASA + AQICN) location

Environment variables

Variable Required Notes
AQICN_TOKEN Yes for get_air_quality Free: https://aqicn.org/data-platform/token/ (1,000 req/min, instant)
PAGASA_API_TOKEN Optional Requires formal PAGASA request. Without it, weather auto-falls-back to Open-Meteo.

Note: the AQICN demo token only returns data for Shanghai and will not work for Philippine cities. You must register for a real token (free, <1 minute).

Data freshness warnings

  • Population: 2020 Census. No later national data exists yet.
  • Poverty: 2023 Full-Year poverty statistics (latest PSA release).
  • Procurement: PhilGEPS open data does not expose filterable search externally. This server scrapes the latest ~100 bid notices and filters client-side. Cached 6h.
  • Emergencies: for real-time disaster response, always check ndrrmc.gov.ph and official PHIVOLCS/PAGASA channels. This server is for research, not life-safety decisions.

Architecture

  • Python 3.11+, fastmcp>=3.0.0,<4.0.0
  • Two HTTP clients: standard + PHIVOLCS_CLIENT with verify=False (PHIVOLCS has a broken SSL cert chain). SSL verification is never disabled globally.
  • In-memory TTL caches per source; no disk writes.
  • stdio transport only (zero hosting cost).
  • PSA table paths are discovered via the PXWeb browse API, never hardcoded.

Development

git clone https://github.com/xmpuspus/ph-civic-data-mcp
cd ph-civic-data-mcp
uv sync --extra dev

# MCP Inspector
fastmcp dev src/ph_civic_data_mcp/server.py

# Tests (run against live APIs)
uv run pytest tests/ -v

# Build
uv run python -m build
uv run twine check dist/*

Limitations

  • PAGASA token is gated. Non-government users may be denied. Open-Meteo fallback removes this as a hard dependency.
  • AQICN token is required. Free but must be requested.
  • PhilGEPS is not real-time. Public portal exposes no filterable API; this server operates on the latest ~100 notices with client-side filtering.
  • Emergencies: direct users to official channels; this is a research tool.

Roadmap (v0.2.0)

  • get_active_disasters / get_situational_report via NDRRMC monitoring dashboard
  • assess_hazard(lat, lng) via HazardHunterPH ArcGIS REST API — per-coordinate flood/earthquake/landslide risk

Prior art

Neither is Python, multi-source, or MCP. This project credits both.

License

MIT. Xavier Puspus. Not affiliated with PHIVOLCS, PAGASA, PhilGEPS, PSA, or EMB.

Contributing

Issues and PRs welcome at github.com/xmpuspus/ph-civic-data-mcp.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ph_civic_data_mcp-0.1.3.tar.gz (2.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ph_civic_data_mcp-0.1.3-py3-none-any.whl (30.7 kB view details)

Uploaded Python 3

File details

Details for the file ph_civic_data_mcp-0.1.3.tar.gz.

File metadata

  • Download URL: ph_civic_data_mcp-0.1.3.tar.gz
  • Upload date:
  • Size: 2.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.6

File hashes

Hashes for ph_civic_data_mcp-0.1.3.tar.gz
Algorithm Hash digest
SHA256 83e1c88ec5978d31fac31d82c67d82eaa40b5c63d4cb2ce760d04964d80319fc
MD5 24d402b9722226efb33507c67a7e6469
BLAKE2b-256 c2505f3877b1c8108076d635def8a7470fcf62526425d1500ad74f77f565a773

See more details on using hashes here.

File details

Details for the file ph_civic_data_mcp-0.1.3-py3-none-any.whl.

File metadata

File hashes

Hashes for ph_civic_data_mcp-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 67121c25c7730f6aefe0a02c5896fabf189022d5bb15dbc35d3281e70a1f1e21
MD5 966dc1af834aced7f4fff2dfc9742267
BLAKE2b-256 6a5d14b8e976ff1b6b303b19f2eca2a105b6330be528e043840a8c459ba0dba1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page