xmpuspus

ph-civic-data-mcp

Community xmpuspus
Updated

The first multi-source MCP server for Philippine civic data: earthquakes, weather, typhoons, procurement, population, poverty

ph-civic-data-mcp

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

PyPIPython 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.

MCP Server · Populars

MCP Server · New