Skip to main content
Glama
xmpuspus

ph-civic-data-mcp

by xmpuspus

ph-civic-data-mcp

Philippine civic data as agent-callable tools. The full PSA OpenSTAT statistical catalog, PSGC location codes, infra-spending accountability, earthquakes, weather, typhoons, procurement, poverty, solar radiation, air quality, satellite vegetation, and macro indicators. Population figures reach barangay level. 41 tools, no API keys.

PyPI Python 3.11+ License: MIT Glama AAA MCP Registry

Philippine civic-data portals publish open data in different shapes: scraped HTML tables, PXWeb JSON, and undocumented APIs. Nothing ties them together for an agent to use. This server does, over stdio, with zero hosting cost and no API key needed. It answers questions such as how many people live in a barangay, whether a place sits near an active fault or volcano, what a city spent on flood control, and how one place compares against another.

All data comes from public records. Heuristic indicators are statistical only. A specific allegation needs independent investigation and a second source.

Install

Every client below runs the same package, uvx ph-civic-data-mcp, over stdio.

Add to Cursor Add to VS Code Install via Smithery Add via Claude Code

Claude Desktop. Add this to claude_desktop_config.json, which sits at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS:

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

Claude Code.

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

Codex. Confirmed live on 2026-09-03.

codex mcp add ph-civic-data -- uvx ph-civic-data-mcp

Cursor. Add this to mcp.json:

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

VS Code. Add this to .vscode/mcp.json:

{
  "servers": {
    "ph-civic-data": {
      "type": "stdio",
      "command": "uvx",
      "args": ["ph-civic-data-mcp"]
    }
  }
}

Docker. Build once, then run with -i for stdio:

docker build -t ph-civic-data-mcp .

The image runs as a non-root user and ships a healthcheck.

setup

That recording is vhs docs/demo_setup.tape. It spawns Claude Code with --mcp-config pointed at this server, and Claude fans out to get_weather_forecast and get_population_stats, then correlates them. The temperatures and the population are what the live sources returned while it recorded. The population turn answers from the 2024 Census of Population (NCR: 14,001,751 as of 1 July 2024).

Related MCP server: mcp-brasil

What can I ask?

ph-civic-data-mcp exposes 41 tools across 19 public sources. Start with get_area_profile for any place-based question. It resolves the name to a PSGC code once, then composes demographics, economy, procurement, hazards, and the 3-day outlook in a single turn, with infra notices already normalized per 100,000 residents.

Get a place at a glance

  • "Give me a profile of Tacloban." get_area_profile

  • "What is the PSGC code for QC?" resolve_ph_location

  • "How many people live in Zamboanga City?" get_population_stats

  • "What is the poverty rate in Eastern Visayas?" get_poverty_stats

  • "Is it safe in Albay right now?" assess_area_risk

  • "List the cities in Cebu province." list_admin_units

  • "Show the full admin hierarchy above this barangay." get_location_hierarchy

Compare two or more places

  • "Compare Cebu City and Davao City on population and poverty." compare_areas

  • "How does Zamboanga's employment rate compare to Cagayan de Oro's?" compare_areas

  • "Export a five-city comparison as a CSV file." compare_areas

Check hazards near a place

  • "Any earthquakes near Legazpi in the last day?" get_latest_earthquakes

  • "Read the full PHIVOLCS bulletin for that quake." get_earthquake_bulletin

  • "What is Mayon's current alert level?" get_volcano_status

  • "Is a typhoon active in the Philippine area right now?" get_active_typhoons

  • "Cross-check that quake against the USGS global feed." get_usgs_earthquakes_ph

  • "What is the river flood outlook for Cagayan de Oro this week?" get_flood_forecast

  • "Which typhoons have passed near Samar since 1990?" get_historical_typhoons_ph

Search procurement and spending

  • "Search every PhilGEPS notice for road repair." search_procurement

  • "Search PhilGEPS for flood control projects in Pampanga." search_infra_projects

  • "Summarize infra spending in Bicol for 2025." summarize_infra_spending

  • "How much procurement activity is there in Region VII?" get_procurement_summary

  • "Flag PhilGEPS notices in Cebu that warrant a closer look." flag_infra_anomalies

  • "Pull the full notice for one flagged project." get_infra_project

Query the PSA statistical catalog

  • "Find PSA tables that mention fertility." search_psa_catalog

  • "Walk me through the poverty subject on OpenSTAT." browse_psa_catalog

  • "What dimensions does this poverty table have?" describe_psa_dataset

  • "Pull poverty incidence by island group for 2023." query_psa_dataset

  • "What is the current inflation rate?" get_inflation_stats

  • "What is the national unemployment rate?" get_labor_stats

  • "Pull PSA health indicators for the latest year." get_health_indicators

  • "What PSIC code covers rice farming?" search_psic_codes

query_psa_dataset needs an explicit value code for every dimension, refuses "all" and "*", and caps a query at 1000 cells. PSA answers a full-cube request with an HTTP 403, so describe_psa_dataset first is the only way in.

Check weather and environment

  • "What is the 5-day forecast for Iloilo?" get_weather_forecast

  • "Any weather alerts active in Bicol?" get_weather_alerts

  • "How much solar radiation does Palawan get?" get_solar_and_climate

  • "What is today's air quality in Manila?" get_air_quality

  • "How has Mindanao's vegetation changed this year?" get_vegetation_index

  • "List the latest PAGASA weather advisories." list_pagasa_advisory_files

  • "What is the Philippine GDP per capita trend?" get_world_bank_indicator

Read the 2025 election results

  • "Walk the election tree down to precincts in Adams, Ilocos Norte." browse_election_results

  • "Show me the vote tally for precinct 28010001." get_election_return

The archive froze on 2025-05-16, so these two read a fixed public record. The tools retrieve and never interpret.

Track new laws and find open datasets

  • "What did the Official Gazette publish this week?" get_official_gazette_feed

  • "Find Philippine flood datasets on HDX." search_hdx_datasets

Every HDX dataset carries its own license. Read license_id before reuse.

Start from a prompt instead of a tool

Three MCP prompts pre-write the multi-step work, so a client can offer them as slash commands or starting points.

  • area_briefing(location) composes a full place briefing.

  • infra_accountability_scan(area) walks the procurement review path.

  • psa_data_explorer(topic) drives the search, describe, query loop.

One tool answers questions about the server itself. get_data_freshness reports the running version, the tool count, every source with its cache window and license, per-host health, and cache ages.

Two MCP resources carry context a client can read without a tool call.

  • data://ph-civic/source-catalog is the source, freshness, and license table.

  • data://ph-civic/civic-framing is the language rule for accountability output.

Full signatures, arguments, and limits for all 41 tools: docs/tool-reference.md.

Get a full profile for one place

get_area_profile("Tacloban") returns the resolved identity, then reports Tacloban's own population next to the national figure, not the region's.

{
 "resolved": {
  "name": "City of Tacloban",
  "psgc_code": "083747000",
  "level": "city"
 },
 "demographics": {
  "population": 259353,
  "population_year": 2024,
  "population_census": "2024 Census of Population",
  "population_reference": "PSA 2024 Census of Population, reference date 2024-07-01.",
  "population_geography_level": "highly_urbanized_city",
  "population_psgc_code": "0831600000",
  "poverty_incidence_pct": 20.6,
  "poverty_reference_year": 2023
 },
 "national_reference": {
  "population": 112729484,
  "population_year": 2024,
  "poverty_incidence_pct": 10.9,
  "poverty_year": 2023,
  "population_share_pct": 0.23,
  "poverty_gap_pct_points": 9.7
 },
 "blocks": {
  "resolve": "success",
  "population": "success",
  "poverty": "success",
  "hazard": "success",
  "weather": "success",
  "national_population": "success",
  "national_poverty": "success",
  "infra": "success"
 },
 "upstream_error": false,
 "caveats": []
}

Captured live on 2026-09-03. Tacloban's own population, 259,353, replaces the Region VIII figure of about 4.6 million that an earlier version reported. Every demographic field names its own census, reference date, and geography level, so an agent never has to guess which population a number belongs to.

An outage returns an envelope, never an empty list

A list tool returns a real list on success. On upstream failure it returns an envelope instead:

{ "results": [], "upstream_error": true, "caveats": ["ConnectError: ..."] }

Read that as "the source was unreachable," never as "no earthquakes" or "no notices." Failures never enter a cache, so a retry is meaningful, and a caveats entry carries the real error rather than an exception class name.

Every single-value tool sets data_status to one of five values:

data_status

Meaning

success

The source returned a value, with its provenance.

empty

The source answered but has no row for this request.

unavailable

The source failed to respond, or sent an unreadable body.

indeterminate

The source answered, but the server cannot trust the result.

invalid_request

The caller sent a bad argument. Fix the argument named in caveats.

upstream_error and validation_error derive from data_status, so a caller can branch on either field. get_area_profile reports one status per block in blocks and folds every failed block into caveats, so a null figure never sits beside an empty caveats list.

Every response carries source and data_retrieved_at.

Sources and freshness

The table below comes straight from SOURCE_CATALOG in server.py, through scripts/render_source_matrix.py, so it cannot drift from what the server actually reports.

Source

What it gives

Freshness

Cache TTL

License

PSGC

Place codes and names, region down to barangay

Updated when PSA publishes new PSGC version (annual or quarterly)

24 h

Public domain (PSA Philippine Standard Geographic Code)

PHIVOLCS earthquakes

Earthquake events and full bulletins

5-minute table refresh; bulletins published per event

5 min

Public, PHIVOLCS public bulletin pages

PHIVOLCS volcanoes

Alert level and bulletin per monitored volcano

Daily bulletins per active volcano

30 min

Public, PHIVOLCS public bulletin pages

PAGASA forecast

10-day weather forecast, with an Open-Meteo fallback

Issued twice daily; Open-Meteo updates hourly

1 h

Open-Meteo CC-BY 4.0 / PAGASA terms

PAGASA typhoons

Active typhoon bulletins and weather alerts

Bulletin every 3-6 hours when storms are active

10 min

Public, PAGASA bulletin pages

PhilGEPS notices / infra

Procurement notices, the infra subset, spending summaries

Latest ~100 bid notices, refreshed every 6h

6 h

Public, PhilGEPS open notice listing

PSA OpenSTAT

Population, poverty, CPI, labor, health, and the full statistical catalog

Per-table vintage. Population: 2024 Census of Population (reference date 2024-07-01), with 2010, 2015 and 2020 by year. Poverty: 2023. CPI/inflation: latest published month (lagged). Labor Force Survey: latest published quarter. Health (1D): per-indicator.

24 h

PSA Open Data terms

Area profile (auto-stitch)

One place profile composed live from every source below

Composed live from PSGC + PSA + PhilGEPS + PHIVOLCS + PAGASA; each block carries its own reference period

1 h

Public, PSA OpenSTAT, PSGC, PhilGEPS, PHIVOLCS, PAGASA

NASA POWER

Daily solar irradiance and climate at any point

Daily, ~3-day latency

24 h

Public domain (NASA)

Open-Meteo air quality

PM2.5, PM10, NO2, SO2, O3, CO, and AQI

Hourly

15 min

Open-Meteo CC-BY 4.0

Open-Meteo flood forecast

Daily river discharge forecast (GloFAS model) for the nearest river cell

Daily GloFAS model run

1 h

Open-Meteo CC-BY 4.0

NASA MODIS NDVI

NDVI and EVI vegetation indices at any point

16-day composite, ~14-day latency

24 h

Public domain (NASA / ORNL)

USGS FDSN

Philippine-region earthquakes, cross-checked against PHIVOLCS

Real-time global feed

10 min

Public domain (USGS)

NOAA IBTrACS

Historical tropical cyclone tracks through the Philippine AOR

Annual update

24 h

Public domain (NOAA)

World Bank Open Data

Philippine macroeconomic indicators

Annual; lag varies by indicator

24 h

World Bank Open Data CC-BY 4.0

HDX

Humanitarian dataset search, with a per-dataset license

Per-dataset metadata_modified; the catalog is searched fresh each query

6 h

HDX (Humanitarian Data Exchange) CKAN API, per-dataset license

Official Gazette RSS

Proclamations, memorandum circulars, and other government issuances

New issuances posted the same day; feed rebuilds on every request

20 min

Public, Official Gazette government record, RA 8293 section 176 default

PAGASA public files

Raw advisory, bulletin, and storm surge PDF file listing

weather_advisory updates about every 6 hours; bulletin only while a cyclone is active; stormsurge has not published since 2019-12-02

15 min

PAGASA public files (pubfiles.pagasa.dost.gov.ph), government record

PSIC

Industrial classification code lookup, by code prefix or description

PSIC revisions change on the order of years

24 h

PSA Philippine Standard Industrial Classification (PSIC), CC BY 4.0

COMELEC 2025 election results

Precinct-level vote tallies, region down to barangay

Archive frozen 2025-05-16 10:00:09 AM; a fixed public record, not a live feed

24 h

Public, COMELEC 2025 election results archive

PAGASA_API_TOKEN is the only environment variable, and it is optional. PAGASA gates it behind a formal request. Without it, forecasts use Open-Meteo. Every one of the 41 tools works with no token at all.

Three vintages worth stating plainly:

  • Population reads the 2024 Census of Population by default, down to barangay level by psgc_code. PSA moved the census folders on OpenSTAT in 2026, so the server discovers them by title on every cold start, and names the census, reference date, and geography level in every result. Pass year for 2010, 2015, or 2020, and psgc_code for a city, municipality, or barangay.

  • Poverty is 2023 Full Year. PSA publishes it every three years.

  • Procurement is not real time. The public portal exposes no filterable API, so this server reads the latest ~100 notices and filters locally. A per-100,000 rate needs at least 500 notices in the sample, so get_area_profile withholds that figure below the threshold and names the reason in caveats.

The OpenSTAT updated field is server wall clock, not data vintage. Read the vintage from the table's own time dimension, which every response reports.

A flagged notice is a starting point, never evidence

flag_infra_anomalies, summarize_infra_spending, and the procurement search produce starting points for investigation, never evidence of wrongdoing. Every flagged item ships with a disclaimer, and the server instructs agents to use defensible language.

high_cost_no_published_progress is named for what it actually checks: the public listing publishes no progress data for any notice, so it is a cost-threshold transparency flag, not a per-project progress check.

For an emergency, use ndrrmc.gov.ph and the official PHIVOLCS and PAGASA channels. This is not a life-safety system but a research tool.

Development

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

# Offline tests, exactly what CI runs
uv run pytest -m "not live"

# Live tests against real upstreams; the weekly workflow runs these every Monday
uv run pytest -m live

# Lint and format check
uv run ruff check .
uv run ruff format --check .

# Build and validate
uv build
uvx twine check dist/*

CI runs the offline suite on Python 3.11, 3.12, 3.13, and 3.14, plus Ruff lint, Ruff format, a build, and a fresh-process check that a bare import exposes all 41 tools. CI action refs are pinned to a commit SHA, not a floating tag.

The docker build step above produces a non-root image with a healthcheck. The server pins fastmcp>=4.0.0,<5.0.0, currently 4.0.2 on MCP SDK 2.1.1.

More

MIT licensed. Built by Xavier Puspus. Not affiliated with PSA, PHIVOLCS, PAGASA, PhilGEPS, DPWH, NASA, NOAA, or the World Bank.

Available Tools

41 tools
assess_area_riskMulti-hazard risk snapshot for a placeA
Read-onlyIdempotent

Multi-hazard risk assessment combining PHIVOLCS + PAGASA.

Makes parallel upstream calls to PHIVOLCS (earthquakes, volcano alert levels) and PAGASA (active typhoons, weather alerts). Expect 3-6 second response time. earthquake_risk_level is a heuristic reading of recent seismic activity, never an official PHIVOLCS hazard assessment. Examples:

assess_area_risk("Manila") assess_area_risk("Batangas")

On failure: this tool never raises. A failed PHIVOLCS or PAGASA sub-call shows up as a caveats entry naming the source, and the other sources still report. data_status is "success" when every sub-call succeeded, "indeterminate" when some failed, and "unavailable" when all failed; upstream_error is true for the last two.

ParametersJSON Schema
NameRequiredDescriptionDefault
locationYesMunicipality, city, or province name.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the annotations by disclosing parallel upstream calls, expected 3-6 second response time, and the heuristic nature of earthquake_risk_level. It also thoroughly explains failure behavior: the tool never raises, failures surface as caveats, and data_status/upstream_error semantics are defined. This is exemplary behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but every sentence earns its place: sources, latency, heuristic caveat, examples, and failure semantics are all relevant. It is well-structured with a clear lead sentence, examples in a block, and failure behavior at the end. No redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description covers input, expected latency, output status semantics, failure behavior, and the important caveat about official vs. heuristic risk. An output schema exists, so return-value details need not be in the description. The agent has everything needed to invoke and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully documents the single location parameter as 'Municipality, city, or province name,' so schema coverage is 100%. The description adds only usage examples like 'Manila' and 'Batangas,' which reinforce but do not substantially extend the schema's meaning. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Multi-hazard risk assessment combining PHIVOLCS + PAGASA.' It clearly names the two data sources and hazard types, and the examples show concrete usage. This distinguishes it from single-source sibling tools like get_volcano_status or get_active_typhoons.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when to use the tool: when a combined multi-hazard snapshot from PHIVOLCS and PAGASA is needed. It also gives a when-not by stating the earthquake risk level is 'never an official PHIVOLCS hazard assessment.' However, it does not explicitly name alternative sibling tools for single-hazard or official-data needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browse_election_resultsBrowse the COMELEC 2025 election results treeA
Read-onlyIdempotent

Walk the COMELEC 2025 election results tree: region down to precinct.

Starts at the 20 regions when code is "0", the default. Pass a child's code from the response to go one level deeper. A barangay's children are its precincts, since the geography tree stops at the barangay level and precincts sit in a separate family. Examples:

browse_election_results() the 20 regions browse_election_results(code="R001000") provinces of Region I browse_election_results(code="2801000") barangays of Adams, Ilocos Norte browse_election_results(code="2801001") precincts of one barangay

On failure: a code that is not "0", a region code, or 7 digits gives validation_error true and data_status "invalid_request", with no request sent. A well-formed code the archive does not recognize gives the same shape after the lookup. A tree response whose rows all fail to parse gives data_status "indeterminate", never cached. A response with some bad rows returns the good rows, with a caveat naming the skipped count. A real outage gives upstream_error true and data_status "unavailable", with the real error in caveats.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNo"0" for the region list, a region code such as "R001000", or a 7-digit province, city, or barangay code from a previous call.0

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is exceptionally transparent about behavior: it details validation errors, 'indeterminate' status with never-cached responses, partial failures with caveats, and upstream errors with real error messages. This goes beyond the annotations (readOnlyHint, idempotentHint) and adds substantial context about system behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than typical but well-structured: opening sentence, examples, and then a clear breakdown of failure modes. While it could be trimmed slightly, the density of useful information justifies the length, and it remains readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and annotations, the description covers all necessary context: navigation pattern, error handling, caching behavior, and partial-failure semantics. It leaves no gaps for an agent to guess about how to invoke or interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'code' is fully documented in the schema (100% coverage) and further explained in the description with examples. The semantics of '0', region codes, and 7-digit codes are explicit, leaving no ambiguity about what values to pass.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: walking the election results tree from regions down to precincts. It uses specific verbs like 'Walk' and 'go one level deeper', and distinguishes it from other data-browsing tools by focusing on the hierarchical COMELEC 2025 results structure.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage instructions: start with code '0' for regions, use returned codes to drill down, and includes concrete examples for each level. It also explains what happens with invalid input and partial failures, giving clear guidance on when and how to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browse_psa_catalogBrowse the PSA OpenSTAT catalogA
Read-onlyIdempotent

List one level of the PSA OpenSTAT statistical catalog.

OpenSTAT publishes roughly 2,900 tables across 27 subjects. This walks that tree one level at a time, so an agent can find a dataset without guessing a table id. A dataset entry is a .px table. Pass its path to describe_psa_dataset before calling query_psa_dataset. Folder depth varies by subject, so keep browsing until entries come back as datasets. Examples:

browse_psa_catalog() the 27 top-level subjects browse_psa_catalog("1F") one level into the Poverty subject browse_psa_catalog("1F/FY") the Full Year Poverty Statistics tables

On failure: data_status is "invalid_request" for a rejected argument and "unavailable" for an OpenSTAT outage. A bad path sets validation_error true before any request goes out. An unreachable catalog sets upstream_error true, with the real error in caveats. Both return an empty entries list, which never means an empty folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoRelative catalog path such as "1F" or "1F/FY". None or "" returns the 27 top-level subjects. Use the `path` field of an entry from a previous call to go one level deeper.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
pathNoRelative path browsed.
sourceYesUpstream data source name.
caveatsYes
entriesYes
licenseNo
source_urlYesCanonical OpenSTAT URL used.
parent_pathNo
folder_countNo
dataset_countNo
upstream_errorNoTrue when OpenSTAT was unreachable. Not an empty result.
validation_errorNoTrue when the caller's arguments were rejected before any request.
data_retrieved_atYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description thoroughly explains failure modes (validation_error, upstream_error, data_status values) and clarifies that an empty list does not mean an empty folder. This goes well beyond the readOnlyHint/idempotentHint annotations, providing detailed behavioral expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized, uses bullet-like examples, and conveys all necessary information without unnecessary verbosity. It is concise yet comprehensive.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool, the description provides sufficient context about the tree structure, failure handling, and integration with sibling tools. The existence of an output schema covers return format, so no critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though the input schema already fully describes the 'path' parameter, the description adds valuable examples ('1F', '1F/FY') and clarifies the navigation rule 'keep browsing until entries come back as datasets', which is absent from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool lists one level of the PSA OpenSTAT catalog, providing examples and explaining its role in navigating the catalog tree. It also distinguishes itself by mentioning 'find a dataset without guessing a table id', making the purpose specific and actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives practical usage guidance, including examples and how to use the 'path' field to go deeper, and mentions sequencing with describe_psa_dataset. However, it does not explicitly contrast this tool with sibling search_psa_catalog, which could confuse an agent about when to browse versus search.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_areasCompare civic indicators across placesA
Read-onlyIdempotent

Compare civic indicators for two to five Philippine places, side by side.

Calls get_area_profile for each place and builds one row per place, so an agent does not have to call the profile tool once per place and merge the results itself. locations needs 2 to 5 entries. metrics, when given, must come from a fixed allowlist of eight names, and it defaults to all eight. format is "json" or "csv". "csv" adds a CSV string under export. Examples:

compare_areas(["Cebu City", "Davao City"]) compare_areas(["Cebu City", "Davao City"], metrics=["population"])

On failure: a rejected request, such as a wrong location count, too many or duplicate metrics, an unknown metric, or a bad format, never calls get_area_profile. It returns validation_error: true and data_status "invalid_request". A place that fails to resolve still gets a row, with resolved_name None, the overall data_status becomes "indeterminate" or "unavailable", and comparable turns false with a caveat naming the unresolved place.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNo"json" (default) or "csv".json
metricsNoNames to compare, from population, population_year, poverty_incidence_pct, poverty_year, headline_inflation_pct, employment_rate_pct, infra_notice_count, earthquake_risk_level. Defaults to all eight.
locationsYes2 to 5 place names, e.g. ["Cebu City", "Davao City"].

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond annotations by detailing the internal behavior: it calls get_area_profile for each place, and on validation failure it never calls that tool. It also explains partial failure state (unresolved places get rows, data_status becomes indeterminate/unavailable, comparable false with caveat). This matches the readOnly and idempotent hints without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and includes examples, but it is somewhat repetitive (e.g., the opening sentence and the aggregation explanation are similar). Still, it earns a high score because all content is relevant and directly aids usage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description is remarkably complete. It covers normal usage, aggregation, validation errors, partial failures, and the output fields that signal these states (validation_error, data_status, comparable, caveat). The presence of an output schema reduces the need for return-value detail, and the description fills the remaining gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers all three parameters, and the description enriches them further: it lists the exact metric names, the default for metrics, the format options, and the location count constraint. It also adds semantic meaning about validation rules that are not fully captured in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: comparing civic indicators across multiple Philippine places. It distinguishes itself from the get_area_profile sibling by noting it aggregates per-place calls into one row per place, preventing the agent from needing to call the profile tool repeatedly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage examples, clarifies the allowed parameter ranges (2-5 locations, 8-metric allowlist, json/csv formats), and explains the conditions under which to use this tool versus alternatives. The failure behavior is also described, giving clear guidance on error handling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

describe_psa_datasetDescribe a PSA OpenSTAT datasetA
Read-onlyIdempotent

Read the dimensions and valid value codes of one PSA OpenSTAT dataset.

Call this before query_psa_dataset. The query tool needs an explicit value code for every dimension, and those codes live here. total_cells is the size of the full cube. A query must select down to max_cells_per_query or fewer, so pick explicit codes per dimension. Examples:

describe_psa_dataset("1F/FY/0241F3DF013.px") dimensions and value codes for one table

On failure: data_status is "invalid_request" for a rejected argument and "unavailable" for an OpenSTAT outage. A path that is not a .px dataset sets validation_error true before any request goes out. An unreadable dataset sets upstream_error true, with the real error in caveats. Both return an empty dimensions list.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataset_pathYesRelative path to a `.px` dataset, for example "1F/FY/0241F3DF013.px". Take it from the `path` field of a browse_psa_catalog dataset entry.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
titleNo
sourceYesUpstream data source name.
caveatsYes
licenseNo
dimensionsYes
source_urlYesCanonical OpenSTAT URL used.
total_cellsNoSize of the full cube.
dataset_pathYes
upstream_errorNoTrue when OpenSTAT was unreachable. Not an empty result.
time_dimensionsNo
validation_errorNoTrue when the caller's arguments were rejected before any request.
data_retrieved_atYes
max_cells_per_queryNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds substantial behavioral detail: failure modes (data_status 'invalid_request' vs 'unavailable'), validation_error for non-.px paths, upstream_error with caveats, and the empty dimensions list on failure. It also mentions total_cells and max_cells_per_query, which are not in annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then gives usage guidance, a concrete example, and a structured failure-mode explanation. Every sentence adds value; the length is justified by the tool's role as a prerequisite and its multiple edge cases. The structure is logical and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists (not shown here but implied by the context signal), the description need not detail return values. It covers the essential calling context (what to do before querying, what the query tool needs), the example path, and all failure modes with their flags. An agent has everything needed to invoke it correctly and interpret outcomes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (the only parameter dataset_path is fully described, including how to get it from browse_psa_catalog). The tool description provides an example but does not add meaning beyond the schema. Per the baseline for high schema coverage, a 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'Read the dimensions and valid value codes of one PSA OpenSTAT dataset.' It clearly distinguishes itself from sibling tools like query_psa_dataset (which it supports) and browse_psa_catalog (which provides the path). The example further clarifies the exact input format.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool: 'Call this before query_psa_dataset.' It explains why ('The query tool needs an explicit value code for every dimension, and those codes live here') and gives a concrete example. While it doesn't mention when not to use it (e.g., for listing datasets), the guidance is unambiguous for its primary role.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

flag_infra_anomaliesFlag infrastructure spending anomaliesA
Read-onlyIdempotent

Flag PhilGEPS infrastructure projects that warrant further review by cross-referencing PHIVOLCS earthquakes and PAGASA typhoon footprints.

This tool emits heuristic anomaly indicators, not accusations. Every flagged item ships with the rule that fired and a disclaimer noting that patterns may have legitimate explanations.

Heuristic rules:

  • duplicate_titles_same_agency: same agency files multiple notices with effectively identical titles (case-insensitive) within the window

  • high_cost_no_published_progress: cost_php exceeds min_cost_php. The PhilGEPS open listing publishes no progress data for ANY notice, so this is a cost-threshold transparency flag, not a project-specific "progress is missing" finding.

  • hazard_overlap: project location keywords overlap with a recent PHIVOLCS earthquake (>=M4.0 in last 30d) or an active PAGASA typhoon footprint, suggesting urgency or post-disaster reconstruction context. Examples:

    flag_infra_anomalies() flag_infra_anomalies(min_cost_php=100_000_000)

On failure: this tool never raises. data_status is "success" when PhilGEPS, PHIVOLCS, and PAGASA all load, "indeterminate" when one or two fail, and "unavailable" when all three fail; upstream_error is true for the last two. A failed sub-call shows up as a caveats entry naming the source, and the flagged list still returns data from every source that did respond.

ParametersJSON Schema
NameRequiredDescriptionDefault
regionNoPH region filter for the project list.
provinceNoProvince filter (partial match).
min_cost_phpNoThreshold for the high_cost_no_published_progress rule (default 50,000,000 PHP).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is unusually explicit about behavior: it never raises, defines data_status values for all failure combinations, explains upstream_error and caveats entries, and notes that partial results still return. It also clarifies that high_cost_no_published_progress is a transparency flag, not a true missing-progress finding, preventing misinterpretation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well organized with separate rule and failure sections, but the 'Examples:' block and repeated explanations make it slightly longer than necessary. Still, every sentence carries useful information and the structure is scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only analysis tool, the description covers all key contextual aspects: rule logic, default thresholds, filtering options, failure states, partial results, and return semantics. Since an output schema is indicated, return fields need not be enumerated in prose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully describes region, province, and min_cost_php with defaults. The description adds meaningful rule context for min_cost_php and shows example values, though it adds little beyond schema for region/province filters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description immediately identifies the tool's purpose: flag PhilGEPS infrastructure projects for further review by cross-referencing PHIVOLCS earthquakes and PAGASA typhoons. It clearly names the three heuristic rules and explicitly frames outputs as indicators, not accusations, so an agent knows what the tool is for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete invocation examples and explains when each rule fires, including the default threshold. It doesn't explicitly contrast with sibling tools like search_infra_projects or assess_area_risk, but the purpose and failure semantics are clear enough for appropriate use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_active_typhoonsActive tropical cyclones in the PARA
Read-onlyIdempotent

Get active tropical cyclones in/near the Philippine Area of Responsibility (PAR).

Returns an empty list when no cyclone is active. This tool parses the live PAGASA bulletin page with regular expressions. A bulletin wording change can miss a cyclone, but the "no active" state itself is reliably detected.

Examples: get_active_typhoons() # only call form, no arguments

On failure: When the PAGASA bulletin page is unreachable, this tool returns data_status "unavailable", upstream_error: true, results: [], and the real error in caveats. That shape never matches a genuine "no active typhoons" answer, which is a bare empty list. When the page loads but neither the "no active cyclone" marker nor a cyclone name matches, this tool returns data_status "indeterminate" instead of guessing at "no active typhoons".

Returns: list of typhoons, each with local_name, international_name, category, max_winds_kph, within_par, signal_numbers, bulletin_number, source, bulletin_url, data_retrieved_at. Or the failure dict above.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly, idempotent, non-destructive), the description details the data source (PAGASA bulletin), the parsing mechanism, the distinction between an empty list and failure/indeterminate states, and the exact shape of failure responses. This greatly enhances transparency for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is succinct, using a single sentence for the core purpose plus a compact failure-mode block. It avoids redundancy and is well-structured, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an explicit output schema in the prompt, the description enumerates all return fields (local_name, international_name, category, etc.) and specifies the alternative failure dict. This gives the agent complete information to use the tool and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the input schema is an empty object with 100% coverage. There is nothing to describe; the description correctly does not add parameter details because none exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Get active tropical cyclones in/near the Philippine Area of Responsibility (PAR).' It uses a specific verb and resource, distinguishing it from weather-related siblings like get_weather_forecast or get_historical_typhoons_ph.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through its name and clear purpose (fetching current typhoon data), but it does not explicitly state when to use it versus alternatives or mention exclusion criteria. The failure and edge-case behavior is well explained, providing context, though not a formal when-to-use statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_air_qualityAir quality at a Philippine locationA
Read-onlyIdempotent

Real-time air quality for a Philippine city via Open-Meteo (no API key).

Returns PM2.5, PM10, CO, NO2, SO2, and O3, plus European AQI and US AQI with category interpretation. Covers about 80 major PH cities through a local coordinate table. measured_at is always UTC, never Asia/Manila time. Examples:

get_air_quality("Manila") # current readings for Metro Manila get_air_quality("Cebu City") # current readings for Cebu City get_air_quality("Davao") # current readings for Davao City

On failure: a location not in the coordinate table returns data_status "invalid_request", with validation_error true and a caveat naming the location. An Open-Meteo fetch failure returns data_status "unavailable", with upstream_error true and the real error text in caveats. A response with no time, an unparseable time, or no pollutant field returns data_status "indeterminate", with upstream_error true and a caveat naming the problem.

ParametersJSON Schema
NameRequiredDescriptionDefault
locationYesCity or municipality name, such as "Manila", "Cebu City", or "Davao".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavioral detail beyond the readOnly/idempotent annotations: measured_at is always UTC, coverage is limited to ~80 cities via a local coordinate table, and there are three explicit failure modes with distinct data_status values. This gives an agent a precise model of the tool's runtime behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and return payload, followed by concise examples and a clearly organized failure-mode section. The length is justified by the operational details, and every sentence serves a distinct purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only tool with an output schema, the description is complete: it covers inputs, outputs, timezone behavior, coverage limits, and all documented error states. No critical information needed to invoke the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes the location parameter well with examples, and schema coverage is 100%. The description adds meaningful semantics by explaining the city-coverage limitation and the invalid_request behavior when a location is not in the coordinate table, going beyond the schema's basic type and example.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: real-time air quality for a Philippine city via Open-Meteo. It enumerates the exact pollutants and AQI types returned, and the Philippine-city scope clearly separates it from sibling weather, earthquake, and health tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly indicates when to use the tool: when a user needs real-time air quality for a Philippine city. It provides usage examples and a coverage caveat, but it does not explicitly name sibling tools or state when-not-to-use conditions, so it falls just short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_area_profileOne-call civic profile for a placeA
Read-onlyIdempotent

One-call correlated civic profile for a Philippine location.

Resolves the place once to its PSA Standard Geographic Code, then composes demographics (population, poverty), economy (regional inflation, national labor), procurement activity, multi-hazard risk, and the short-range weather outlook — in a single agent turn instead of eight. Adds derived cross-source context (e.g. infrastructure notices per 100k residents) so the caller does not have to normalize raw counts itself. Examples:

get_area_profile("Cebu City") city-level demographics, hazard, weather get_area_profile("NCR") region-level, no province in the chain get_area_profile("Tacloban") city under a resolved province

On failure: each block (population, poverty, inflation, labor, hazard, weather, infra, resolve) gets its own status in blocks. A failed sibling appears there and in caveats, never as a silent null. The top-level upstream_error is true only when a block is genuinely unreachable, not when a sibling rejected an argument or returned a real empty answer.

ParametersJSON Schema
NameRequiredDescriptionDefault
locationYesMunicipality, city, province, or region name. e.g. "Leyte", "Cebu City", "Davao Region", "NCR".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already state readOnly and idempotent, and the description further details failure behavior: per-block status, caveats for failed siblings, and the specific condition for upstream_error. This provides additional behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficient and well-structured, including examples and failure handling without redundant words. Every sentence contributes valuable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers input expectations, usage examples, and error behavior, which is sufficient for an agent to invoke the tool correctly. It does not enumerate the exact output structure but mentions the block layout, which is adequate for a composite tool of this nature.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully describes the 'location' parameter with examples for municipalities, cities, provinces, and regions. The description does not add extra semantic detail beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool provides a one-call civic profile for a Philippine location, specifying the scope and giving concrete examples. It implicitly distinguishes itself from specialized siblings by emphasizing aggregation of multiple data types into a single result.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions consolidating eight data types in one call, suggesting use over multiple specialized tools, but does not provide explicit when-to-use guidance or alternatives. Examples show usage but no clear directive on when to prefer this tool over siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_data_freshnessServer health and data-source catalogA
Read-onlyIdempotent

Server health and data-source catalog probe.

Doubles as the version and health endpoint: returns server_version so an agent can confirm which release it is talking to. Also returns the full upstream-source catalog: cache TTLs, freshness expectations, and licenses. Use it to judge whether a stale cached response is fine or a re-fetch is needed.

Examples: get_data_freshness() # the only call, it takes no arguments

On failure: this tool calls no upstream itself, so it always returns a dict. source_health is a process-local, in-memory registry, not a database. It starts empty on a cold process and fills as fetch_with_retry runs calls, so a fresh restart always reports an empty dict here.

Returns: server_version, server_name, transport, tool_count, asof, sources (list of {source, source_url, freshness, cache_ttl_seconds, license}), source_health (per-host {last_success_at, last_failure_at, last_error, last_latency_ms, success_count, failure_count}), cache_age (per-cache {size, ttl_seconds}), note.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly, idempotent, non-destructive), the description reveals important behavioral details: it makes no upstream calls, always returns a dict, and that source_health starts empty on a cold process. This transparency helps the agent understand runtime behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections for purpose, example, failure behavior, and return fields. It is informative without being overly verbose, and the example clarifies that no arguments are needed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers what the tool returns, including edge cases (empty cache on cold start, note field), and explains when to use it. Given the zero-parameter complexity, it provides all necessary context for correct invocation and interpretation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is 100% (empty schema). The description adds no parameter-specific meaning because none exist. Per the rubric, with high schema coverage and no parameters, the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's dual function as a server health/version probe and a data-source catalog, and explicitly explains its purpose: to judge whether a stale cached response is acceptable or a re-fetch is needed. This distinguishes it from sibling data-fetching tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides direct usage guidance: 'Use it to judge whether a stale cached response is fine or a re-fetch is needed.' It also notes the tool doubles as a version/health endpoint, giving clear context for when to invoke it over other tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_earthquake_bulletinPHIVOLCS earthquake bulletinA
Read-onlyIdempotent

Get the full bulletin for a PHIVOLCS earthquake event.

Parses the bulletin page PHIVOLCS publishes for one event: magnitude, depth, location, date and time, and per-municipality intensity reports. Give the bulletin_url a prior get_latest_earthquakes call returned. A hand-built or off-host URL is refused before any fetch is attempted. Examples:

get_earthquake_bulletin("https://phivolcs.dost.gov.ph/index.php") # real bulletin URL shape

On failure: an empty, malformed, or non-PHIVOLCS bulletin_url, or a 404 on the page itself, returns a dict with url, source, caveats, and data_retrieved_at only, with no data_status, upstream_error, magnitude, or location fields. A fetch that raises an exception sets data_status "unavailable" and upstream_error true.

ParametersJSON Schema
NameRequiredDescriptionDefault
bulletin_urlYesFull URL returned by get_latest_earthquakes.bulletin_url.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly, idempotent, etc.), the description discloses substantial behavior: what data it parses (magnitude, depth, location, date/time, per-municipality intensity), and detailed failure handling (empty/malformed/non-PHIVOLCS/404 returns a dict without data_status or upstream_error; exceptions set data_status 'unavailable' and upstream_error true).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense and well-structured, covering purpose, usage, example, and failure modes. It is slightly verbose with the example and failure specifics, but every sentence adds useful context, so it earns a strong score rather than a perfect one.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (one parameter, failure modes, external data source), the description is complete. It explains the input requirement, the parsing behavior, and all failure scenarios. Since an output schema exists, the description need not enumerate return fields, and it still covers edge cases thoroughly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes bulletin_url as 'Full URL returned by get_latest_earthquakes.bulletin_url.' The description adds meaning by reinforcing the source constraint, stating that hand-built or off-host URLs are refused, and giving an example URL shape. This goes beyond the schema's basic type/description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Get the full bulletin for a PHIVOLCS earthquake event.' It specifies the resource (PHIVOLCS bulletin) and distinguishes it from sibling tools like get_latest_earthquakes, which lists events rather than retrieving details for a single event.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: pass a bulletin_url returned by a prior get_latest_earthquakes call, and explains that hand-built or off-host URLs are refused. This tells the agent exactly when and how to invoke the tool, and provides failure conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_election_returnCOMELEC 2025 precinct election returnA
Read-onlyIdempotent

One precinct's official vote tally from the COMELEC 2025 archive.

Give the 8-digit precinct code from browse_election_results. Returns every national and local contest counted at that precinct, with each candidate's vote count and share. Examples:

get_election_return("28010001") Adams, Ilocos Norte, precinct 0001

On failure: a code that is not 8 digits gives validation_error true and data_status "invalid_request", with no request sent. A code the archive does not recognize (a 403 body carrying its AccessDenied marker) gives the same shape. A body missing 'information', where 'national' or 'local' is not a list, or where a contest carries a non-list nested 'candidates' value, gives data_status "indeterminate" with upstream_error true. Any other outage, including a 403 with no AccessDenied marker, gives data_status "unavailable" with upstream_error true and the real error in caveats.

ParametersJSON Schema
NameRequiredDescriptionDefault
precinct_codeYes8-digit precinct code, such as "28010001".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the readOnlyHint/idempotentHint annotations by detailing exact failure modes: invalid 8-digit codes produce validation_error and 'invalid_request'; unrecognized codes produce a 403 with an AccessDenied marker; malformed payloads produce 'indeterminate'; and other outages produce 'unavailable' with the real error in caveats. This is exceptional behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then provides an example and a well-organized failure taxonomy. Every sentence serves a distinct purpose: defining the resource, explaining the input source and output, giving an example, and enumerating error shapes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with an output schema present, the description fully covers what the tool returns, how to get the parameter, and every known failure mode. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents precinct_code with an example, and the description reinforces that with the '28010001' example and the source instruction 'from browse_election_results.' It also adds parameter-validation behavior (non-8-digit codes return validation_error with no request sent), which goes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'One precinct's official vote tally from the COMELEC 2025 archive.' It clearly distinguishes this tool from browse_election_results by stating the code comes from that browsing tool and that this returns all contests for a single precinct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs the agent to obtain the 8-digit precinct code from browse_election_results, which is a concrete usage path. It does not, however, explicitly state when not to use this tool or name an alternative for browsing multiple precincts, though the single-precinct framing implies it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_flood_forecastRiver flood forecast for a Philippine locationA
Read-onlyIdempotent

Daily river discharge forecast for a Philippine place, from Open-Meteo's GloFAS model.

Returns a daily river_discharge_m3s series for the nearest river cell to the resolved location, plus its max and min bounds, in cubic meters per second. This is a model estimate, not a gauge reading, so treat it as one signal among many for flood risk. Examples:

get_flood_forecast("Cagayan de Oro") # 7-day default forecast get_flood_forecast("Marikina", forecast_days=14, past_days=3) # 14 days ahead, 3 days back

On failure: an unresolved location, or a forecast_days or past_days value that is not a whole number or is out of range, returns data_status "invalid_request", with validation_error true and days []. A PSGC outage during location resolution, or an Open-Meteo fetch failure, returns data_status "unavailable", with upstream_error true and days []. A response with no readable daily.time entries, or a river_discharge list shorter than daily.time (including an empty list), returns data_status "indeterminate", with upstream_error true, days [], and is never cached.

ParametersJSON Schema
NameRequiredDescriptionDefault
locationYesCity, municipality, or province name.
past_daysNoDays of past discharge to include, from 0 to 30. Default 0.
forecast_daysNoDays ahead to forecast, from 1 to 30. Default 7.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description thoroughly discloses behavior beyond the annotations: it states the output is a model estimate rather than a gauge reading, and enumerates three distinct failure modes (invalid_request, unavailable, indeterminate) with exact conditions and returned fields. No contradiction with the readOnly/idempotent hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but efficiently organized, with a clear opening statement, examples, and a structured failure mode list. Slightly longer than necessary but every sentence adds critical operational detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The presence of an output schema is noted, and the description provides a high-level summary of the response (daily series, max/min bounds, units). It does not repeat the schema verbatim but gives enough context for an agent to understand the result shape and error handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters are fully described in the input schema, and the description repeats their semantics (e.g., location is a city/municipality/province, past_days range 0-30, forecast_days range 1-30). The description also illustrates their usage in the examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provides a daily river discharge forecast for a Philippine location from the GloFAS model, specifying the return series and units. It distinguishes itself from other weather and disaster tools by focusing on river discharge.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage context with examples for both default and customized parameters, and explicitly advises treating the output as 'one signal among many' for flood risk. This guides an agent on when and how to invoke the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_health_indicatorsPhilippine health indicatorsA
Read-onlyIdempotent

National health indicators from PSA OpenSTAT (subject 1D).

With no argument, returns the curated national headline set: maternal mortality ratio and total fertility rate. Pass a free-text indicator to fuzzy-match any table published under the Health subject. The available list is browse-discovered, never hardcoded. Examples:

get_health_indicators() maternal mortality ratio and fertility rate get_health_indicators(indicator="fertility") one matching table

On failure: a catalog browse failure sets data_status "unavailable" and upstream_error true, with an empty indicators list. A keyword that matches no table sets data_status "success" with an empty indicators list and a caveat, not an error flag. A partial fetch failure across matched tables sets data_status "indeterminate" and upstream_error true. validation_error stays false in every case.

ParametersJSON Schema
NameRequiredDescriptionDefault
indicatorNoOptional free-text indicator name, for example "maternal mortality", "fertility". None returns the default headline set.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is fully transparent about behavior, including failure modes with data_status updates, caveats, and upstream_error flags. It adds context beyond the annotations by detailing specific error scenarios, and does not contradict any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet comprehensive, using structured sections for examples and failure modes. It front-loads the core purpose and avoids extraneous detail, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with an output schema, the description adequately covers return behavior (headline set, indicators array, data_status, caveats, error flags) without needing to restate the schema. It is complete for an agent to understand what to expect and how to handle edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents the optional indicator parameter with examples, and the description reinforces this by explaining the fuzzy-match behavior, the default null behavior, and that the list is browse-discovered rather than hardcoded. This goes well beyond the baseline coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: retrieving national health indicators from PSA OpenSTAT (subject 1D). It distinguishes itself from sibling tools by focusing specifically on health data, with explicit examples of default outputs and fuzzy matching behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool: with no argument for a default headline set, or with an indicator name for fuzzy matching. It does not explicitly contrast with alternative tools such as search_psa_catalog, but the specialization to health indicators makes the appropriate use case clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_historical_typhoons_phHistorical typhoon tracks through the PARA
Read-onlyIdempotent

Historical tropical cyclone tracks that passed through the Philippine AOR.

Sourced from NOAA IBTrACS (International Best Track Archive), the authoritative global archive for tropical cyclone tracks. Filtered to the Western Pacific basin and coordinates inside the Philippine Area of Responsibility, aggregated per storm. The result streams the source CSV row by row and returns the most recent storms that crossed the PAR, sorted by start time. Returns peak intensity, minimum pressure, and track period. Examples:

get_historical_typhoons_ph() # last 3 years, up to 30 storms get_historical_typhoons_ph(year=2024) # season 2024, up to 30 storms get_historical_typhoons_ph(year=2024, limit=10) # season 2024, up to 10 storms

On failure: a stream error, a response with no data rows, or a CSV header missing a required column returns a dict. data_status is "unavailable", upstream_error is true, and results is empty, with the real error text in caveats.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoSeason year. None returns recent (last 3 years).
limitNoMax storms to return (default 30).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint and idempotentHint, and the description adds transparency about failure modes (e.g., returning a dict with data_status and caveats on errors) and streaming behavior. This goes beyond the annotations by explaining what happens on failure, though it does not discuss performance or side effects beyond that. The additional detail is valuable but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is reasonably concise but contains some redundancy—for instance, 'Historical' appears in both the title and first sentence, and the filtering/aggregation details are restated. The structure (purpose, source, output, examples, failure) is logical and efficient, with no irrelevant information, but slightly more compression would improve clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with only two optional parameters and no output schema, the description provides a comprehensive picture: it states the data source, filtering logic, output fields, default behavior, examples, and error handling. This is sufficient for an agent to invoke the tool correctly without further reference. The inclusion of failure modes and examples makes it highly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of parameters with clear descriptions (year nullable with default, limit with default). The description reinforces these with examples showing defaults and clarifies the meaning of 'None' for year. While the schema alone already explains the parameters, the examples and context about 'most recent' add useful practical nuance, earning a slightly above-baseline score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it returns historical tropical cyclone tracks within the Philippine Area of Responsibility, with details on source (NOAA IBTrACS), filtering, and output fields (peak intensity, minimum pressure, track period). It is readily distinguishable from sibling tools like get_active_typhoons, which focus on current storms, by the explicit 'Historical' label and the 'most recent storms' phrasing tied to the optional year parameter.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides examples and explains parameter defaults, implicitly guiding when to use this tool (e.g., for historical typhoon data). However, it does not explicitly contrast with alternatives like get_active_typhoons or state 'use this for historical data, not for active storms.' The guidance is implicit rather than explicit, so it falls short of a clear when/when-not directive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_inflation_statsPhilippine consumer-price inflationA
Read-onlyIdempotent

Headline consumer-price inflation (year-on-year, all items) from PSA.

Source: PSA OpenSTAT Consumer Price Index, 2018-based. The tool discovers the current CPI series by text, never a hardcoded table id, and returns the most recently published month's year-on-year change. PSA publishes with a lag, so the reported period is the latest one PSA has, not always the current month. Examples:

get_inflation_stats() national headline inflation, latest month get_inflation_stats(area="NCR") one region

On failure: every failure, including an area name PSA does not list, sets data_status "unavailable" and upstream_error true, with the real error or a not-found message in caveats. validation_error stays false in every case, because a bad area name is treated as an outage here, not a caller mistake.

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoRegion or "Philippines". None returns the national figure. For example "NCR", "Region VII", "Davao Region".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations mark readOnly, idempotent, and not destructive, and the description adds explicit failure semantics: any error sets data_status to 'unavailable' and upstream_error true, while validation_error stays false even for an invalid area name. This goes beyond the annotations and fully discloses edge-case behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat verbose but includes necessary repetition of examples and failure modes in a structured manner. It stays focused and does not include irrelevant information, though it could be tightened without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple one-parameter tool and the presence of an output schema (per context), the description adequately explains the return concept (year-on-year change) and failure behavior. It does not enumerate specific output fields, but the output schema and simple structure make this unnecessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema fully describes the single 'area' parameter with default null and examples. The description repeats and clarifies that null returns the national figure, and the schema coverage is 100%, leaving no ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns the most recently published month's year-on-year inflation change from PSA, with national and regional options. It distinguishes from siblings like get_health_indicators and get_weather_forecast by explicitly naming inflation and the PSA source.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete examples and notes the publication lag, helping the agent decide when to call it. It does not explicitly compare to a sibling tool for inflation-related queries, but the purpose is evident from the title and examples.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_infra_projectInfrastructure notice detailA
Read-onlyIdempotent

Return the full record for one infrastructure project by project_id.

This tool looks up project_id inside the same latest ~100-notice PhilGEPS window search_infra_projects reads. An id from an older window returns matched: false, not an error, because the window has already moved on. Examples:

get_infra_project("PHILGEPS-INF-003") get_infra_project("DOES-NOT-EXIST")

On failure: an empty project_id or a project missing from the current window both return matched: false with a caveat, no upstream_error, and no data_status. A PhilGEPS fetch failure returns matched: false, data_status "unavailable", upstream_error true, and the real error text in caveats.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idYesReference number from search_infra_projects.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavioral detail beyond the annotations (readOnly, openWorld, idempotent). It explains the window concept, how missing or empty IDs are handled (return matched: false with caveat), and how upstream failures are reported (data_status 'unavailable', upstream_error true). This fully discloses expected behavior in edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet comprehensive, structured with a clear main purpose, followed by context about the window and failure modes. It uses consistent formatting with examples, making it easy to parse. No redundant or extraneous information is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully explains the tool's behavior in normal and edge cases, and its relationship to search_infra_projects. Since an output schema exists, it does not need to describe return values. The description is self-contained enough for an agent to invoke it correctly without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides 100% coverage with the description 'Reference number from search_infra_projects.' The tool description repeats the parameter name and includes examples, but does not add new semantic information beyond the schema. Given the high coverage, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Return the full record for one infrastructure project by project_id.' It specifies the resource (infrastructure project) and the action (return full record), distinguishing it from search_infra_projects which likely returns multiple results. The scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it by referencing the 'same latest ~100-notice PhilGEPS window search_infra_projects reads,' suggesting it is the follow-up to a search. It also explains failure behavior, but it does not explicitly state when not to use it or mention alternative tools, though the sibling list provides context. Overall, usage is clear but not explicitly exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_labor_statsPhilippine labor-force indicatorsA
Read-onlyIdempotent

Key labor-force indicators from the PSA Labor Force Survey.

Returns labor-force participation, employment, unemployment, and underemployment rates for the latest published reference period. The PSA key-indicator series is national only. Passing region does not filter the figure. It only adds an explanatory caveat, because this table has no regional breakdown. Examples:

get_labor_stats() national rates, latest reference period get_labor_stats(region="Cebu") same national rates, plus a caveat

On failure: an OpenSTAT discovery or query failure sets data_status "unavailable" and upstream_error true, with the real error in caveats. validation_error stays false in every case.

ParametersJSON Schema
NameRequiredDescriptionDefault
regionNoAccepted for API symmetry. The LFS key-indicator table is national only. Passing a region adds an explanatory caveat.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly and idempotent annotations, the description discloses failure behavior in detail, including data_status 'unavailable', upstream_error true, caveats carrying the real error, and validation_error always false. This gives agents a clear picture of success and failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured, starting with purpose, then return content, then parameter behavior, examples, and failure semantics. It is concise without redundant padding and each section adds useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read-only tool, the description covers purpose, return indicators, parameter semantics, example calls, and failure behavior. It is fully sufficient for an agent to decide when and how to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter 'region' is fully described in both the schema and the description, with explicit clarification that it is accepted for API symmetry and does not filter results. The description adds meaningful behavioral detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns key labor-force indicators from the PSA Labor Force Survey, including participation, employment, unemployment, and underemployment rates. It also notes the national-only scope, distinguishing it from other area-level statistics tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool: when national labor-force indicators for the latest period are needed. It explicitly explains that passing a region does not filter results but only adds a caveat, giving clear usage expectations without referencing alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_latest_earthquakesLatest PHIVOLCS earthquakesA
Read-onlyIdempotent

Get the latest earthquake events from PHIVOLCS.

Reads the live PHIVOLCS earthquake list, the same table shown at earthquake.phivolcs.dost.gov.ph. Give center_lat, center_lon, and radius_km together to filter events near one place, and each matched event then carries a distance_km field. Give all three together, or leave out all three. Examples:

get_latest_earthquakes() latest events, default filters get_latest_earthquakes(min_magnitude=4.0, limit=10) strong events only get_latest_earthquakes(center_lat=14.5995, center_lon=120.9842, radius_km=50) near Manila

On failure: an invalid trio, an out-of-range radius_km, center_lat, or center_lon gives validation_error true and data_status "invalid_request". An unreachable or unparsable PHIVOLCS list gives upstream_error true and data_status "unavailable". Both return results: [] with the real error in caveats.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax events to return (default 20, max 100).
regionNoFilter by PH region/province/city name (partial match).
radius_kmNoKeep only events within this distance of (center_lat, center_lon). Give all three of center_lat, center_lon, and radius_km together, or none of them. Each returned event then carries a distance_km field.
center_latNoLatitude of a search point. Give with center_lon and radius_km to filter to events near one place instead of the full recent-events list.
center_lonNoLongitude of a search point. Give with center_lat and radius_km.
min_magnitudeNoMinimum magnitude to include (default 1.0).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds concrete behavioral details beyond the readOnly/idempotent annotations: describes empty results with caveats, validation_error flags, and upstream_error handling. This enriches the annotation-only view.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured: purpose first, then grouped examples, then failure behavior. Each sentence adds value; no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, not detailing return fields is acceptable. The description covers usage scenarios, parameter relationships, and error behavior, making it complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema covers all 6 parameters (100%), and the description adds the grouping constraint (center_lat, center_lon, radius_km must be given together or not at all) and explains the distance_km output field, exceeding the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Get the latest earthquake events from PHIVOLCS.' This clearly distinguishes it from siblings like get_usgs_earthquakes_ph and get_earthquake_bulletin.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context with examples of default, filtered, and location-based calls, and describes failure modes. Does not explicitly contrast with similar earthquake tools, but the PHIVOLCS focus makes usage apparent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_location_hierarchyFull PSGC hierarchy for a placeA
Read-onlyIdempotent

Return the full chain region -> province -> city/municipality -> barangay for one PSGC code.

This tool checks that psgc_code is well-formed before it sends any request. A malformed code never reaches the network. An unknown but well-formed code, or a PSGC mirror outage, both produce an empty chain instead of a match. Check the fields named below to tell the two apart. Examples:

get_location_hierarchy("072217000") Cebu City, chain walks up through province and region get_location_hierarchy("999999999") well-formed but unknown code get_location_hierarchy("not-a-code") malformed, rejected before any network call

On failure, a malformed code returns validation_error: true, data_status "invalid_request", and chain: [], with no network call made. A genuine mirror outage during lookup or the hierarchy walk returns chain: [], upstream_error: true, and the real error in caveats. A clean unknown-code answer returns chain: [] and caveats, with neither key set.

ParametersJSON Schema
NameRequiredDescriptionDefault
psgc_codeYes9-digit PSGC code (leading zeros optional).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (read-only, idempotent), the description explains validation before network calls, distinct failure modes for malformed codes, unknown well-formed codes, and mirror outages, plus which return fields distinguish them. This is substantial behavioral disclosure that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but each part earns its place: purpose, behavioral model, examples, and failure modes. The main purpose is front-loaded, and the examples illustrate edge cases clearly. Minor redundancy exists between the examples and the later failure explanation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a single required parameter, rich annotations, and an output schema, the description covers everything needed to invoke the tool correctly: valid input, rejected input, unknown input, and outage behavior. An agent can predict results across all relevant cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though the schema covers the single psgc_code parameter 100%, the description adds meaningful semantics: well-formedness checks, examples with real codes, and how different code classes map to different return fields. An agent gains practical understanding beyond the raw type/format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource: 'Return the full chain region -> province -> city/municipality -> barangay for one PSGC code.' The output is precisely scoped, making it easy to distinguish this from location-adjacent siblings like resolve_ph_location or list_admin_units.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: this is for a single PSGC code and produces a full hierarchical chain. It does not explicitly name alternative tools or exclusion conditions, but the usage context is strong enough that an agent can decide when this tool applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_official_gazette_feedOfficial Gazette RSS feedA
Read-onlyIdempotent

Latest issuances from the Official Gazette of the Republic of the Philippines.

Reads the government's own RSS feed of proclamations, memorandum circulars, and other issuances, ten items per page, newest first. Examples:

get_official_gazette_feed() # page 1, the newest 10 issuances get_official_gazette_feed(page=2) # the next 10 issuances

On failure: a page outside 1 to 50 returns data_status "invalid_request" with validation_error true and no fetch attempted. A Cloudflare block page, the only other response this host sends on a bad call, returns data_status "unavailable" with upstream_error true and the real status and content type in caveats. An item with neither a title nor a link is dropped and counted in caveats. A page 1 response that parses as valid RSS but keeps zero issuances, whether the feed sent none or every item was dropped, is drift and returns data_status "indeterminate". A page above 1 with zero issuances is a genuine empty page and returns data_status "empty".

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage of the feed, 1 to 50. Page 1 reads /feed/, a page above 1 reads /feed/?paged=<page>. Default 1.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly, idempotent, non-destructive), the description thoroughly discloses runtime behavior: it details pagination URL patterns, all failure modes (invalid_request, unavailable, indeterminate, empty), and specific handling of items lacking title or link. This goes well beyond the basic annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed yet well-organized, starting with purpose, then examples, then failure modes. While slightly long, every sentence adds value and there is minimal redundancy with the schema description. The structure is logical and front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all key operational aspects: pagination, error handling, data_status values, and item filtering. It does not detail the output schema fields, but that may be provided separately. For a feed-reading tool, the description is sufficiently complete to guide correct usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides comprehensive description of the 'page' parameter (range, URL mapping, default). The tool description adds meaning by explaining the consequences of out-of-range pages (invalid_request) and behavior for pages above 1 with zero items (empty), enriching the semantic understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool reads the Official Gazette RSS feed of Philippine issuances. The verb 'Reads' and resource 'Official Gazette' are specific, and it is easily distinguished from sibling tools focused on earthquakes, weather, or procurement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides examples and explains pagination and failure modes, but it does not explicitly state when to use this tool over alternatives (e.g., no comparative guidance against other government data tools). The usage context is implied by the tool's unique purpose but not explicitly contrasted with siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_population_statsPhilippine population statisticsA
Read-onlyIdempotent

Population from the PSA Census of Population, discovered live on OpenSTAT.

Defaults to the latest census PSA publishes: the 2024 Census of Population, reference date 2024-07-01, as of 2026-09. Pass year for an older census (2010, 2015, 2020). Every result names its census, reference date and geography level, and for the 2024 tables the PSGC code PSA keyed the row on. Examples:

get_population_stats() national total, latest census get_population_stats(region="NCR") one region, province or HUC by PSA label get_population_stats(region="Cebu", year=2020) get_population_stats(psgc_code="0831600000") City of Tacloban, 2024 Census get_population_stats(psgc_code="083747000") same place, 9-digit code get_population_stats(psgc_code="1380100001") one barangay, 2024 Census

On failure: data_status is "unavailable" when PSA is down, with upstream_error true. data_status is "invalid_request" for an unknown region, year, or PSGC code, with validation_error true. data_status is "empty" when a valid PSGC code has no row in the chosen census table. caveats always carries the real error text. population is None in every failure. Failures are never cached.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoCensus year. None picks the latest. A year PSA has no census for returns validation_error with available_vintages.
regionNoRegion, province or highly urbanized city as PSA labels it, such as "NCR", "Region VII", "CAR", "BARMM", "Leyte", "City of Manila". None returns the national total.
psgc_codeNoA 9- or 10-digit PSGC code from resolve_ph_location. Reaches cities, municipalities and barangays (2024 Census only). Not combined with region.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is transparent about output behavior on success and failure, including population being None, caveats carrying error text, and failures never being cached. The readOnlyHint and idempotentHint annotations align with the described behavior, and no side effects are hidden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well organized with a concise overview, a set of illustrative examples, and a separate failure-mode section. While detailed, the information is directly relevant and avoids unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides enough context for an agent to know when to call this tool, how to choose parameters, what output fields to expect, and how to interpret error states. Combined with the fully described input schema, it is self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three optional parameters are described in the schema with clear semantics, including examples, default behavior, constraints such as not combining psgc_code with region, and validation_error outcomes for unknown values. The description complements the schema rather than duplicating it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns Philippine population statistics from the PSA Census, including defaulting to the latest census year and supporting national, regional, provincial, city, municipal, and barangay lookups. It also gives concrete examples that illustrate the intended use.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains default behavior, available years, parameter combinations, and the prerequisite relationship to resolve_ph_location for PSGC codes. It also enumerates failure modes with corresponding data_status values, making expected behavior explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_poverty_statsPhilippine poverty incidenceA
Read-onlyIdempotent

Poverty incidence from the PSA Full Year Poverty Statistics table.

PSA publishes this once a year, with a lag. As of 2026-09 the latest published year is 2023. The tool discovers the current table live, so a later release shows up without a code change. It also returns the subsistence incidence when PSA publishes both tables for the same year. Examples:

get_poverty_stats() national poverty incidence, latest year get_poverty_stats(region="Bicol") one region, PSA label get_poverty_stats(region="NCR") National Capital Region

On failure: a discovery failure, a missing Incidence dimension, an unparseable year label, or a query failure sets data_status "unavailable" and upstream_error true. A region PSA does not list sets data_status "invalid_request" and validation_error true. A table with no matching incidence measure, or a cell whose values field is not a list, sets data_status "indeterminate" and upstream_error true. A published ".." cell for the region and year sets no error flag and no data_status. Check caveats instead. A subsistence-table failure sets upstream_error true on an otherwise valid poverty figure, but leaves data_status at "success".

ParametersJSON Schema
NameRequiredDescriptionDefault
regionNoPH region (None returns national).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the readOnly/idempotent annotations by detailing data_status values, upstream_error and validation_error conditions, handling of unpublished '..' cells, and subsistence-table failure behavior. This gives an agent a clear picture of success and failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, followed by examples and then failure semantics. It is somewhat lengthy but each section serves a distinct informative purpose, and the organization is logical.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the existing output schema, the description covers source cadence, data lag, live discovery, examples, and an extensive set of error/status behaviors. It is sufficiently complete for an agent to invoke the tool correctly and interpret unusual results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes the optional region parameter and its None default. The description adds useful examples with 'Bicol' and 'NCR', and clarifies that an unlisted region leads to an invalid_request status, enriching the parameter semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool returns poverty incidence from the PSA Full Year Poverty Statistics table, and the title and examples make the tool's purpose immediately understandable. It is distinct enough from siblings by referencing the specific PSA poverty dataset.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when PSA poverty incidence data is needed, and the examples show national and regional calls. However, it does not explicitly compare against sibling tools or state when not to use this tool, so guidance is mainly implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_procurement_summarySummarize PhilGEPS procurementA
Read-onlyIdempotent

Aggregate procurement statistics over the latest notices cached from PhilGEPS.

This tool aggregates the same latest ~100-notice window search_procurement reads (6h cache). rules_evaluated names which breakdowns ran, by_mode and by_region. rules_not_computable explains why total_value_php stays null: PhilGEPS open notices do not publish approved budget amounts. Examples:

get_procurement_summary() get_procurement_summary(agency="DPWH", year=2025)

On failure: data_status "unavailable", upstream_error true, totals zero and by_mode/by_region/top_agencies empty, with the real PhilGEPS error in caveats. A year that is not a plain integer returns validation_error: true and data_status "invalid_request" before any fetch, naming the bad value.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoFilter publish date to this year. Drops an undated record and notes the dropped count in caveats.
agencyNoPartial agency match filter.
regionNoPH region filter.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds behavioral context beyond annotations by explaining the 6-hour cache window, error response structure (data_status, upstream_error, validation_error), and dropped-count notes in caveats. This is useful, though it stops short of detailing internal side effects (which are none anyway).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is repetitive: the same text about the ~100-notice window, rules_evaluated, rules_not_computable, and error handling appears nearly verbatim in multiple paragraphs. It is not concise and could be halved without losing information. The structure is okay, but the redundancy significantly harms the score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an explicit output schema listing, the description comprehensively enumerates key output fields (data_status, upstream_error, totals, by_mode, by_region, top_agencies, caveats, validation_error) and covers all error scenarios and validation rules. It also mentions the cache window and filter behavior, making it self-sufficient for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% description coverage for all three parameters (year, agency, region), including details like dropping undated records. The description repeats these examples but does not add any new semantic meaning beyond what the schema already states, so it does not improve upon the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool aggregates procurement statistics over the latest PhilGEPS notices and explicitly contrasts with search_procurement by referencing the same ~100-notice window. The verb 'aggregate' and resource 'procurement statistics' are specific, and the sibling differentiation is direct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit guidance on when to use this tool versus search_procurement (same window, different purpose) and includes concrete examples. It also documents validation error behavior and failure conditions, leaving no ambiguity about the intended use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_solar_and_climateSolar irradiance and climate at a pointA
Read-onlyIdempotent

Daily solar irradiance and climate variables from NASA POWER for any coordinate.

Returns daily solar irradiance, 2m temperature, corrected precipitation, and 2m wind speed, in kWh per m2, Celsius, mm, and m per second. Useful for solar-site screening, farm planning, and historical climate checks. Examples:

get_solar_and_climate(14.5995, 120.9842) # Manila, last 14 days get_solar_and_climate(14.5995, 120.9842, "2026-04-01", "2026-04-02") # a fixed 2-day window

On failure: an upstream fetch failure or a non-object response body returns data_status "unavailable", with upstream_error true, days [], and the real error text in caveats. A properties or parameter field that is missing, null, or not an object returns data_status "indeterminate", with upstream_error true and days []. A start_date or end_date that does not parse as YYYY-MM-DD, an end_date before start_date, a span over 366 days, or a latitude or longitude out of range, returns data_status "invalid_request", with validation_error true and days [].

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoISO date string (YYYY-MM-DD). Defaults to today. The span from start_date to end_date cannot exceed 366 days.
latitudeYesDecimal degrees, WGS84.
longitudeYesDecimal degrees, WGS84.
start_dateNoISO date string (YYYY-MM-DD). Defaults to 14 days ago.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly and idempotent hints in annotations, the description details data source, units, return variables, and comprehensive failure modes including specific data_status values for upstream errors, invalid dates, range violations, and malformed responses. This gives a full behavioral picture.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with purpose, return values, use cases, examples, and failure modes, but it is somewhat lengthy and repeats that daily solar irradiance and climate variables are returned. Overall it is appropriately detailed without being excessively verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and the description covers data source, units, typical use cases, examples, and detailed error behavior, the context is largely complete. It does not specify exact output fields, but the output schema and error descriptions fill that gap sufficiently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers parameter meanings with defaults, date span limits, and coordinate format, so the description adds limited new parameter-level semantics. It reinforces validation behavior regarding invalid dates and out-of-range coordinates, but does not define latitude/longitude ranges or add detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns daily solar irradiance and climate variables from NASA POWER for any coordinate, naming specific variables and units. It also identifies use cases like solar-site screening and farm planning, leaving no ambiguity about the tool's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides concrete examples and notes general use cases, but does not explicitly guide when to choose this tool over closely related siblings like get_weather_forecast or get_flood_forecast. The examples and stated applications give enough practical direction for most agents.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_usgs_earthquakes_phUSGS earthquakes near the PhilippinesA
Read-onlyIdempotent

Philippine-region earthquakes from USGS, cross-reference to PHIVOLCS.

Returns events inside the PH bounding box (lat 4..22, lng 115..130) that USGS catalogs, including international-standard Mww/Mwc magnitudes and depth solutions. Complements PHIVOLCS with global-network analysis. Give center_lat, center_lon, and radius_km together to filter to one place, and each matched event then carries a distance_km field. Give all three together, or leave out all three. Examples:

get_usgs_earthquakes_ph() last 30 days, magnitude 4.0+ get_usgs_earthquakes_ph(start_date="2026-08-01", end_date="2026-08-31") get_usgs_earthquakes_ph(center_lat=14.5995, center_lon=120.9842, radius_km=50) near Manila

On failure: an invalid trio, an out-of-range radius_km, center_lat, or center_lon gives validation_error true and data_status "invalid_request". The same happens for a start_date or end_date that is not YYYY-MM-DD. An unreachable USGS API, or a payload that is not a GeoJSON FeatureCollection, gives upstream_error true and data_status "unavailable". A nonempty features list where every feature fails to parse gives upstream_error true and data_status "indeterminate", and is never cached. All three return results: [] with the real error in caveats.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax events to return (default 50, USGS hard-caps at 20000).
end_dateNoISO date (YYYY-MM-DD). Defaults to today.
radius_kmNoKeep only events within this distance of (center_lat, center_lon). Give all three of center_lat, center_lon, and radius_km together, or none of them. Each returned event then carries a distance_km field.
center_latNoLatitude of a search point. Give with center_lon and radius_km to filter to events near one place instead of the whole PH bbox.
center_lonNoLongitude of a search point. Give with center_lat and radius_km.
start_dateNoISO date (YYYY-MM-DD). Defaults to 30 days ago.
min_magnitudeNoMinimum magnitude (default 4.0 to keep noise low).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description openly discloses network dependency on the USGS API, validation failure modes, upstream failure modes, and caching behavior. It aligns with the readOnlyHint, idempotentHint, and destructiveHint annotations, and there is no contradiction between the described behavior and the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but well structured and information-dense, with examples and failure cases. Very little is redundant; the only minor inefficiency is repeating the 'give all three together' rule in both the parameter section and the main description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers invocation, parameter constraints, expected output markers, and error states, which together provide sufficient context for correct use. It does not detail the full success output schema, but the output schema is indicated as available and the result fields are not necessary for invoking the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers all parameters, and the description adds useful semantic detail: limit caps, default magnitudes, date format expectations, the center/radius grouping rule, and the resulting distance_km field. This goes well beyond the schema descriptions and fully clarifies how parameters interact.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as retrieving Philippine-region earthquake data from USGS and explicitly contrasts it with PHIVOLCS-oriented offerings. It states the geographic scope, the source, and the distinctive value (international-standard magnitudes, global-network analysis), so an agent can distinguish it from sibling earthquake tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides concrete usage examples, default behaviors, and explicit constraints such as 'give all three of center_lat, center_lon, and radius_km together, or none of them.' It also enumerates failure scenarios and what the caller should expect in response, making invocation behavior predictable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vegetation_indexMODIS vegetation index at a pointA
Read-onlyIdempotent

NASA MODIS MOD13Q1 NDVI and EVI vegetation index at any coordinate.

NDVI (Normalized Difference Vegetation Index) ranges -1 to 1. Higher values indicate denser healthy vegetation. EVI is more sensitive in high-biomass areas. The composite period is 16 days at 250m resolution. Useful for farm monitoring, deforestation tracking, and drought checks. Examples:

get_vegetation_index(15.58, 121.0) # last ~90 days at a point in Isabela get_vegetation_index(15.58, 121.0, "2026-08-01", "2026-08-15") # a fixed 15-day window

On failure: both MODIS bands failing returns data_status "unavailable", upstream_error true, samples [], and both band errors in caveats. One band failing still returns the other band's samples, but data_status stays "unavailable" with upstream_error true. A band whose rows carry no numeric value counts as that band failing. A pixel with no composite in range, such as one over water, is a real success with samples []. A latitude or longitude out of range returns data_status "invalid_request", with validation_error true and samples []. A start_date or end_date that does not parse as YYYY-MM-DD, or a span over 366 days, also returns data_status "invalid_request", checked before any fetch.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoISO date (YYYY-MM-DD). Defaults to today.
latitudeYesDecimal degrees, WGS84.
longitudeYesDecimal degrees, WGS84.
start_dateNoISO date (YYYY-MM-DD). Defaults to ~90 days ago. The span from start_date to end_date cannot exceed 366 days.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description thoroughly explains edge cases: successful empty results over water, partial MODIS band failures, invalid-request handling, and date span limits. This goes well beyond the basic annotations and gives an agent a precise mental model of the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed yet structured, with examples and explicit failure-mode statements that each add value. It is slightly verbose, but the richness of edge-case information justifies the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema and annotations, the description covers input validation, output behavior for successes and failures, and partial-failure handling. No significant gaps remain for an agent to safely invoke and interpret the tool's results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers all parameter descriptions, including units, date format, defaults, and the 366-day span limit. The description adds examples and failure explanations but introduces no new parameter-level semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as retrieving NASA MODIS MOD13Q1 NDVI and EVI vegetation index values at a coordinate. It also distinguishes the tool by stating common use cases like farm monitoring, deforestation tracking, and drought checks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete examples and lists typical use cases, providing clear context for when the tool is appropriate. It does not explicitly contrast alternatives among the many sibling tools, but the examples are sufficient to imply when to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_volcano_statusPhilippine volcano alert levelsA
Read-onlyIdempotent

Get current alert level for Philippine volcanoes.

Reads the WOVODAT bulletin list PHIVOLCS publishes for its monitored volcanoes: Mayon, Taal, Kanlaon, Bulusan, Pinatubo, Hibok-Hibok, and Parker. When one volcano's bulletin fetch fails, that entry carries upstream_error true and a caveat with the real error, not a null alert_level. Examples:

get_volcano_status() all monitored volcanoes, one call get_volcano_status("Mayon") one volcano by name get_volcano_status("Taal")

On failure: WOVODAT list unreachable or empty gives data_status "unavailable", upstream_error true, results: [], and the real error in caveats. An unmatched volcano_name gives a one-item list with alert_level null and a caveat, not a failure envelope.

ParametersJSON Schema
NameRequiredDescriptionDefault
volcano_nameNoe.g. "Mayon", "Taal", "Kanlaon", "Bulusan". None returns all monitored volcanoes with recent bulletins.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description fully discloses failure modes: per-entry fetch failures produce upstream_error and caveat instead of null alert_level, and unreachable/empty lists yield data_status 'unavailable', upstream_error true, empty results, and error in caveats. This matches the readOnly and idempotent annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is logically organized with examples and failure cases, but it is slightly verbose and repeats some details (e.g., failure behavior is mentioned twice). Still, it remains focused and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description doesn't need to enumerate return fields, but it does mention key fields (data_status, upstream_error, results, caveats) in failure scenarios, providing enough context for callers to handle errors without additional lookup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description for volcano_name is comprehensive, including examples and the special case of None returning all monitored volcanoes. There are no enums, but the free-form string is adequately explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get current alert level for Philippine volcanoes' and specifies the data source (WOVODAT bulletin list). It is distinct from sibling tools covering earthquakes, weather, and other data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit examples for calling with no arguments or with a volcano name, and describes behavior when the list is unreachable or a name is unmatched. However, it does not explicitly contrast with sibling tools or state when to prefer this tool over others.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_weather_alertsPAGASA weather alertsA
Read-onlyIdempotent

Get active PAGASA weather alerts and advisories.

The PAGASA homepage embeds alert names such as "Heavy Rainfall Warning" in its navigation menu and breadcrumbs, as well as in real active-warning sections. This tool reliably detects the "No Active Warnings" state, but it cannot yet isolate a real active warning from that navigation text. To avoid a fabricated advisory, this tool returns a bare empty list only for the confirmed "no active warnings" marker. For real-time advisories, call bagong.pagasa.dost.gov.ph directly. Examples:

get_weather_alerts() no region argument get_weather_alerts(region="NCR") region only changes the cache key

On failure, when the PAGASA homepage is unreachable, this tool returns data_status "unavailable", upstream_error: true, results: [], and the real error in caveats. When the page is reachable but the "no active warnings" marker does not match, this tool returns data_status "indeterminate" instead of guessing, and never caches that response.

ParametersJSON Schema
NameRequiredDescriptionDefault
regionNoFor example "NCR", "Region VII", "CALABARZON". None returns all.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Honestly discloses that only the 'No Active Warnings' state is reliable, and that active warnings may be missed due to navigation text. Also explains data_status values, upstream_error, and caching behavior, making side effects and limitations transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is slightly verbose but every sentence carries valuable caveats or examples. The structure is logical, covering purpose, limitations, and failure behavior without unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and caveats, the description covers all necessary context: what it can and cannot do, parameter behavior, failure states, and when to call upstream directly. No missing information that would impair correct usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers the region parameter with examples, and the description adds the crucial insight that region only affects the cache key, not the result set. This goes beyond the schema and prevents misuse.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool fetches active PAGASA weather alerts and advisories, distinguishing it from weather forecasts or typhoon tracks. The examples further clarify its narrow scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage caveats: region only changes the cache key, not filtering; direct access for real-time advisories is recommended; failure modes are described. This tells the agent when to use and not use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_weather_forecastPhilippine weather forecastA
Read-onlyIdempotent

Get the weather forecast for a Philippine location.

Uses the PAGASA TenDay API when PAGASA_API_TOKEN is set, and falls back to Open-Meteo when the token is absent or the PAGASA call fails. This tool sets no data_status field on a success or an unknown-location result. Check data_source and caveats instead. Examples:

get_weather_forecast("Manila") 3-day default forecast get_weather_forecast("Cebu City", days=2) 2-day forecast get_weather_forecast("Wakanda") unknown location, no coordinates found

On failure, a location with no known coordinates returns days: [] and a caveat, with no data_status or upstream_error key. An Open-Meteo fetch failure, or a PSGC outage during location resolution, returns data_status "unavailable", upstream_error: true, days: [], and the real error in caveats. An Open-Meteo response with no daily forecast entries returns data_status "indeterminate" instead, and is never cached.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoForecast days (1-10, default 3).
locationYesMunicipality, city, or province name.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already indicate readOnly, idempotent, and non-destructive behavior. The description goes beyond by detailing the data source fallback logic, the exact data_status values on failures (e.g., 'unavailable', 'indeterminate'), and caching behavior. This provides a rich picture of expected behavior without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a clear opening statement, concise paragraphs on fallback and error behavior, and illustrative examples. It delivers necessary details without redundancy or fluff, making it easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of data sources and error handling, the description covers key output fields (data_status, caveats, upstream_error, days) and explains when they appear. Although the full output schema is not shown, the description provides sufficient context for an agent to interpret results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers both parameters with descriptions (location as municipality/city/province, days as integer with default 3). The description adds practical examples for parameter usage and clarifies error outputs, which enhances understanding. Since schema coverage is 100%, the baseline is 3, but the examples push it to 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Get the weather forecast for a Philippine location.' It uses a specific verb and resource, and the scope is well-defined. It also distinguishes itself from weather-related siblings like get_weather_alerts and get_active_typhoons by focusing on forecasts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the fallback behavior (PAGASA vs Open-Meteo) and how to interpret error cases via data_source and caveats, which guides usage. However, it does not explicitly mention when to use this tool over alternatives like get_weather_alerts, so it falls short of fully explicit guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_world_bank_indicatorWorld Bank indicator for the PhilippinesA
Read-onlyIdempotent

World Bank macroeconomic and social indicator for the Philippines.

Accepts a World Bank indicator code, such as "NY.GDP.MKTP.CD", or a friendly alias, such as "gdp", "poverty_ratio", "inflation", or "urban_population_pct". The tool checks the indicator code shape before it reaches the URL, so a bad value cannot redirect the request to another country's data. Examples:

get_world_bank_indicator("gdp") # GDP, latest 20 years get_world_bank_indicator("NY.GDP.MKTP.CD", per_page=5) # same indicator, 5 years get_world_bank_indicator("poverty_ratio") # poverty headcount ratio

On failure: an indicator code or alias that fails the shape check returns data_status "invalid_request", with validation_error true and observations []. An upstream fetch failure returns data_status "unavailable", with upstream_error true, observations [], and the real error text in caveats. A row with a non-numeric or non-finite value (NaN, inf) is skipped and counted in caveats. A response where every row is non-numeric or non-finite returns data_status "unavailable" instead of a false empty answer.

ParametersJSON Schema
NameRequiredDescriptionDefault
per_pageNoNumber of observations to return (latest first, default 20).
indicatorYesWB code or alias. See INDICATOR_ALIASES in source for the curated list of common indicators.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses every failure mode in detail: invalid request shape, upstream unavailability, skipped non-numeric rows, and the special case where all rows are skipped. It also mentions the pre-validation of indicator codes to prevent URL redirects. This aligns fully with the readOnly and idempotent annotations, with no contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: it starts with a clear purpose, provides concrete examples, then lists all failure conditions in a readable bullet-like paragraph. It is detailed but not wordy, with every sentence contributing to understanding the tool's behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all necessary aspects for correct usage, including input formats, output expectations through failure cases, and edge cases. Although the output schema is not shown in the prompt, the description explains the key fields (data_status, observations, caveats) and the conditions under which they appear, making it self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes both parameters with 100% coverage. The description adds value by explaining alias behavior, giving examples of per_page values, and clarifying that aliases are curated in INDICATOR_ALIASES. This goes beyond the schema's basic type and default information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches a World Bank macroeconomic or social indicator for the Philippines, with concrete examples for both code and alias input. It distinguishes itself from siblings by focusing specifically on World Bank data, though it does not name alternative tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage examples and explains the behavior for valid and invalid inputs, including error handling. It does not explicitly contrast with sibling tools like get_poverty_stats, but the purpose is unambiguous enough that an agent can infer when to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_admin_unitsList Philippine administrative unitsA
Read-onlyIdempotent

Browse children of a PSGC node, or top-level regions when parent_code is None.

An unrecognized parent_code or level filter matches no children and returns an empty list. This tool never returns validation_error. A malformed argument degrades to an empty result instead of a failure. Examples:

list_admin_units() top-level regions list_admin_units(parent_code="072200000") children of Cebu province list_admin_units(level="city-municipality", limit=10) first 10 cities and municipalities

On failure, only a PSGC API outage returns a failure envelope: data_status "unavailable", upstream_error: true, results: [], and the real error in caveats. A malformed parent_code or level returns an empty list instead of this failure shape.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNoFilter children by level (region|province|city|municipality|district|barangay).
limitNoMax units to return (default 50, capped at 500).
offsetNoSkip this many matching units before returning results. Page past 500 children (for example, Manila has 897 barangays) by calling again with offset=500.
parent_codeNoParent PSGC code. None returns the regions list.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description explicitly explains malformed inputs return an empty list rather than a validation error, and that only an upstream API outage produces a failure envelope. This goes well beyond the annotations in setting caller expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with examples and clear behavior notes. It is slightly repetitive around malformed arguments returning empty results, but overall every sentence serves a purpose and the layout aids readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has optional parameters, an output schema, and no prerequisites, the description covers all necessary caller context: pagination, empty-result behavior, and error semantics. It does not need to describe return fields because the output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers all parameters with useful descriptions, and the tool description reinforces this with examples, offset pagination guidance, and the parent_code=None region-list behavior. It adds helpful context without being redundant with the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb ('Browse'/'List') and resource ('children of a PSGC node' or 'top-level regions'). The examples further distinguish it from related location tools by showing concrete calls such as list_admin_units(parent_code="072200000").

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to invoke the tool: top-level regions without parent_code, children with parent_code, and optional level filtering. It does not explicitly compare against sibling tools like get_location_hierarchy, but the examples and parameter semantics sufficiently imply the intended usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_pagasa_advisory_filesPAGASA public advisory, bulletin, and storm surge filesA
Read-onlyIdempotent

List PAGASA public PDF files from a pubfiles directory listing, newest first.

Reads the nginx directory index PAGASA publishes at pubfiles.pagasa.dost.gov.ph/tamss/weather// and returns each PDF's name, URL, last-modified time, and size. This tool returns file URLs only, never PDF bytes, so fetch a PDF yourself if you need its contents. Examples:

list_pagasa_advisory_files() latest weather advisories list_pagasa_advisory_files(kind="bulletin", limit=5) 5 newest cyclone bulletins list_pagasa_advisory_files(kind="stormsurge") storm surge folder, flagged stale

On failure: an unknown kind, or a limit outside 1 to 100, gives validation_error true and data_status "invalid_request". A 404, a body with no directory listing, zero parsed files, or a parser error on a 200 body gives data_status "indeterminate". A transport failure or a non-2xx status gives data_status "unavailable". All three carry files: [] and the real error in caveats.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoOne of "weather_advisory", "bulletin", "stormsurge".weather_advisory
limitNoMax files to return, newest first (1 to 100, default 20).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the readOnly/idempotent annotations by detailing the exact source (nginx directory index), the returned fields (name, URL, last-modified time, size), the fact that no PDF bytes are returned, and the full failure-mode taxonomy with data_status values. It also flags the storm surge folder as stale, adding meaningful behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but well structured: purpose is front-loaded, followed by mechanism, examples, and failure behavior. Every sentence adds useful information, and the examples with comments make the intended usage immediately understandable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description covers everything an agent needs: data source, return fields, the important caveat that only URLs are returned, and exhaustive failure-status behavior. Nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers both parameters with defaults, ranges, and allowed values, so the baseline is 3. The description adds value by showing example calls, clarifying the meaning of kind as a folder selector, and confirming validation behavior for out-of-range limits and unknown kinds.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it lists PAGASA public PDF files from the pubfiles directory index, newest first. It clearly differentiates this from weather-content tools by stating it returns file URLs only, never PDF bytes, which distinguishes it from siblings like get_weather_alerts or get_weather_forecast.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete usage examples and an explicit when-not-to-use condition: if you need PDF contents, fetch the PDF yourself. It does not name sibling alternatives or conditions for choosing them, but it clearly communicates the intended use case for this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_psa_datasetQuery a PSA OpenSTAT datasetA
Read-onlyIdempotent

Run one bounded query against a PSA OpenSTAT dataset.

Every dimension needs an explicit list of value codes from describe_psa_dataset. That is a hard requirement, not a convention. PXWeb expands an unselected dimension to all of its values, and PSA answers the resulting full-cube request with an HTTP 403. PSA writes a missing cell as "..", and those come back as null, never zero. Examples:

one dataset, every dimension given an explicit code list

query_psa_dataset( "1F/FY/0241F3DF013.px", {"Year": ["2"], "Major Island Group": ["0", "2"], "Among Families/Population": ["0"]}, )

On failure: a bad path, a bad max_rows, or a rejected selection (a missing dimension, an unknown code, or "all"/"*") sets validation_error true and data_status "invalid_request", before any request goes out. An OpenSTAT outage sets upstream_error true and data_status "unavailable". A zero-row reply for a nonzero selection, or a row whose key does not map to the declared columns, sets data_status "indeterminate" and upstream_error true on a real HTTP 200. All four cases return an empty rows list.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_rowsNoCap on returned rows (1-5000, default 500).
selectionsYesDimension code -> list of value codes, covering every dimension the dataset declares. "all" and "*" are rejected. Example: {"Year": ["2"], "Major Island Group": ["0", "2"], "Among Families/Population": ["0"]}.
dataset_pathYesRelative `.px` path, for example "1F/FY/0241F3DF013.px".

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
rowsYes
titleNo
sourceYesUpstream data source name.
caveatsYes
licenseNo
row_countYes
truncatedNo
disclaimerNo
source_urlYesCanonical OpenSTAT URL used.
dataset_pathYes
upstream_errorNoTrue when OpenSTAT was unreachable. Not an empty result.
requested_cellsNo
reference_periodNoData vintage read from the table's own time dimension.
validation_errorNoTrue when the caller's arguments were rejected before any request.
data_retrieved_atYes
total_rows_availableNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses detailed error handling: validation errors, upstream outages, indeterminate statuses, and empty rows on failure. It also reveals that missing cells are null, never zero, which is not covered by the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence serves a purpose: stating the core function, the critical all-dimensions requirement, an example, and detailed failure semantics. It is front-loaded with the most important constraint and well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all relevant operational aspects: required parameters, constraints, error conditions, and return behavior for failures. It is sufficient for an agent to call the tool correctly without needing to see the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides extensive parameter descriptions, and the description reinforces key points like the need to cover every dimension and the rejection of 'all'/'*'. It adds the practical hint to obtain value codes from describe_psa_dataset, which aids parameter selection.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly defines the tool as running a bounded query against a specific PSA OpenSTAT dataset. It distinguishes this from sibling tools like browse or search by focusing on retrieving data rows for a known dataset path.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how to use the tool (must provide explicit value codes for all dimensions, avoid 'all'/'*') but does not explicitly state when to choose this tool over alternatives like describe_psa_dataset or search_psa_catalog. There is no comparison to siblings, so usage context is inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_ph_locationResolve a Philippine place name to PSGCA
Read-onlyIdempotent

Fuzzy-resolve a Philippine place name to its canonical PSGC record.

Handles common nicknames directly, such as "QC", "Gensan", "CDO", and "Metro Manila". An ambiguous name such as "San Juan" still returns one best match, plus an alternatives list of the other candidates. This tool sets no data_status field on any path. Check matched and upstream_error instead. Examples:

resolve_ph_location("Cebu City") exact city match resolve_ph_location("QC") nickname resolves to Quezon City resolve_ph_location("San Juan") ambiguous name, returns alternatives

On failure, a clean no-match returns matched: false and caveats, with no upstream_error key at all. When the PSGC API itself is unreachable, it returns matched: false, upstream_error: true, and the real error in caveats.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesFree-text place name. Examples: "Sta. Mesa, Manila", "Cebu City", "NCR", "Pampanga", "Tagaytay".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description transparently explains return behavior beyond the annotations: it states that no data_status field is set, that matched and upstream_error should be checked, and precisely describes the two failure modes. This is consistent with the readOnlyHint, idempotentHint, and openWorldHint annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, with a clear opening statement, useful examples, and explicit failure-mode explanations. Every sentence contributes to understanding the tool's behavior without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple one-parameter input and available output schema, the description sufficiently covers expected outcomes, including success, ambiguous matches, and both failure modes. It provides all necessary context for an agent to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes query as a free-text place name with examples. The description adds meaning by clarifying that fuzzy matching and common nicknames are accepted, which informs how the query parameter is interpreted. No additional parameter details are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's specific verb and resource: fuzzy-resolve a Philippine place name to a canonical PSGC record. It also differentiates itself from sibling tools by focusing on place-name resolution rather than data retrieval, and includes concrete examples.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives practical usage guidance by noting that common nicknames are handled, ambiguous names return a best match plus alternatives, and failure modes are distinguishable via matched and upstream_error. It does not explicitly compare against alternate sibling tools, but the usage behavior is well explained.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_hdx_datasetsSearch HDX for Philippine humanitarian datasetsA
Read-onlyIdempotent

Search HDX for Philippine humanitarian datasets by keyword.

Calls the CKAN package_search action filtered to the Philippines country group and returns matching datasets, most recently modified first, each with its own license and up to 20 resources. Examples:

search_hdx_datasets("flood") datasets matching "flood" search_hdx_datasets("food prices", rows=5) 5 most recently modified matches

On failure: an empty query, a query over 200 characters, a query with a control character, or a rows value outside 1 to 50 gives validation_error true and data_status "invalid_request". An unreachable HDX API gives upstream_error true and data_status "unavailable". A response whose success field is not true, or whose result.results field is not a list, gives upstream_error true and data_status "indeterminate". Datasets sent beside a missing or non-integer count also give data_status "indeterminate", with the parsed datasets kept and never cached: CKAN always sends a real count, so a bad one is drift even when the datasets read fine. Zero datasets on a clean query with a real integer count gives data_status "empty", never a failure, and still caches. Every dataset carries its own license_id: read it before you reuse a resource.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsNoNumber of datasets to return, 1 to 50 (default 10).
queryYesFree-text search term, 1 to 200 printable characters, for example "flood", "food security", "displacement".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond annotations by detailing all error conditions (validation_error, upstream_error, indeterminate), data_status values (invalid_request, unavailable, empty), caching behavior, and edge-case handling (e.g., zero results with a real count). This is a model of transparent behavior disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with paragraphs covering purpose, examples, and failure modes. It is dense with useful information without being redundant. Every sentence contributes essential details, and the formatting makes it easy to scan. Despite its length, it is appropriately concise given the number of edge cases it addresses.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all relevant aspects needed to correctly invoke the tool and interpret results: source API, country filter, sorting, output fields (license_id), error handling, and caching. It even includes warnings about consent (reading license_id before reuse). This provides comprehensive contextual information beyond the schema and annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers the parameters and their constraints (query length, rows range). The description adds value by providing usage examples, explaining the default sorting, and clarifying the effect of invalid values (e.g., rows outside 1-50). Since schema coverage is 100%, the baseline is 3, and the description gives extra context, earning a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: searching HDX for Philippine humanitarian datasets by keyword. It also explains the underlying CKAN action and provides concrete examples, making it unambiguous and distinct from sibling tools like search_procurement or search_psa_catalog.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage examples and details on query and rows parameters, but it does not explicitly contrast with alternatives. However, the tool's specific scope (HDX datasets) and the provided examples make it obvious when to use it, so it falls just short of a 5 due to lack of explicit 'use this instead of X' guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_infra_projectsSearch infrastructure noticesA
Read-onlyIdempotent

Search Philippine government infrastructure projects.

Backed by PhilGEPS open notice listing filtered for infra-related work (construction / road / bridge / flood control / drainage / school building / civil works). Source: https://www.philgeps.gov.ph/. Approved budget amounts are not published in the open notice listing, so cost_php is null in most records. min_cost_php almost never matches, because the open listing omits approved budget for nearly every record. The DPWH transparency portal API is currently blocked by Cloudflare and not used. Examples:

search_infra_projects(keyword="flood control") search_infra_projects(region="ncr") search_infra_projects(min_cost_php=100_000_000)

On failure: returns {results: [], upstream_error: true, data_status: "unavailable", caveats: [...]} instead of a bare list, with the real upstream error in caveats. This tool never checks an argument before the PhilGEPS fetch runs, so validation_error is always false.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoFilter publish date to this calendar year. Excludes records with no publish date, so a year filter never returns an undated record.
limitNoMax results (default 25, capped at 100).
regionNoPH region filter (partial match against agency text).
statusNoStatus filter (partial match, e.g. 'open', 'awarded').
keywordNoTitle/agency substring (e.g. 'flood control', 'bridge').
provinceNoProvince name filter (partial match).
min_cost_phpNoMinimum approved cost in PHP. The open notice listing does not publish approved budget for almost any record, so setting this today returns few or no results rather than a true cost-ranked subset.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Clearly discloses limitations: cost_php is usually null, min_cost_php almost never matches, the upstream DPWH API is blocked, and validation_error is always false. Also states the exact failure return shape, so agents know what to expect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The summary is front-loaded and the examples are useful, but the budget caveat is stated twice in slightly different words, adding minor redundancy. Overall it remains appropriately sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers source, filtering scope, parameter caveats, failure behavior, and usage examples. With a full input schema and output schema present, nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All seven parameters are described with matching schema types, defaults, and matching semantics (partial match, exclusion of undated records, cap on limit). The min_cost_php caveat is reinforced in the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a precise one-line summary: 'Search Philippine government infrastructure projects.' The scope, data source, and filtering logic (infra-related work categories) are all stated, so an agent immediately knows what the tool returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides concrete invocation examples and key caveats (budget data missing, DPWH API blocked, failure object). It does not explicitly contrast with sibling search tools, but the scope and examples make intended usage clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_procurementSearch PhilGEPS procurement noticesA
Read-onlyIdempotent

Search PH government procurement from PhilGEPS open data.

Note: the PhilGEPS public portal does not expose server-side search for external clients, so this tool fetches the latest ~100 bid notices and filters them in-memory. Data is cached 6 hours. Keyword/agency/region filters are applied client-side (case-insensitive substring match). Examples:

search_procurement(keyword="flood") search_procurement(keyword="", agency="DPWH", limit=10)

On failure: returns {results: [], upstream_error: true, data_status: "unavailable", caveats: [...]} instead of a bare list, so an outage is never read as "no matching notices". A date_from or date_to that does not parse returns {results: [], validation_error: true, data_status: "invalid_request"} before any fetch, naming the bad value.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (default 20, max 100).
agencyNoPartial match on procuring entity name.
regionNoPH region filter (partial match).
date_toNo
keywordYesSearch term matched against title + agency + classification.
date_fromNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes failure behavior in detail: upstream outage returns a structured object with upstream_error and data_status 'unavailable', invalid dates return validation_error; also discloses caching and client-side filtering. This goes beyond the readOnly/idempotent annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-organized: one-sentence purpose, a note on implementation constraints, examples, and a failure-mode paragraph. No redundant content; all sentences carry useful operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity, the description covers caching, filter behavior, examples, and error shapes. It does not explain date formats, but the core calling contract is sufficiently specified and the output schema/annotations fill remaining context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers limit, agency, region, and keyword decently. Description adds that filters are case-insensitive substring matches and that date_from/date_to are validated. However, date_from/date_to lack format and semantic meaning (e.g., publication date) in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly names the resource (PH government procurement from PhilGEPS open data) and the action (search). The tool name and title reinforce the scope, and it is distinct from nearby search tools for infrastructure or datasets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides concrete usage notes: the portal lacks server-side search, so it fetches ~100 notices and filters in-memory; filters are case-insensitive substring matches; data is cached 6 hours. Examples illustrate valid calls including keyword-only and keyword+agency+limit. It does not explicitly contrast with sibling search tools, but the usage context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_psa_catalogSearch the PSA OpenSTAT catalogA
Read-onlyIdempotent

Find a PSA OpenSTAT dataset by keyword, without browsing level by level.

Matches a case-insensitive substring against every dataset title and path in the catalog. The first call after a cold start walks the whole ~2,900-table tree and can take a few minutes. The flattened index then caches for 24 hours, so a later search answers from memory. Examples:

search_psa_catalog("fertility") datasets with "fertility" in the title or path search_psa_catalog("poverty incidence", limit=5) at most 5 matches

On failure: data_status is "invalid_request" for an empty keyword or a bad limit, and "unavailable" for an OpenSTAT outage during the catalog walk. validation_error or upstream_error is set to match. The real error sits in caveats. Neither failure is cached.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of matches to return (1-100, default 20).
keywordYesCase-insensitive substring to match against a dataset title or path, for example "fertility", "poverty incidence", "CPI".

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
limitNo
sourceYesUpstream data source name.
caveatsYes
keywordYes
licenseNo
matchesYes
source_urlYesCanonical OpenSTAT URL used.
data_statusNo
match_countYes
upstream_errorNoTrue when OpenSTAT was unreachable. Not an empty result.
total_availableNo
validation_errorNoTrue when the caller's arguments were rejected before any request.
data_retrieved_atYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description fully discloses behavioral traits: read-only, idempotent, first-call latency, 24-hour caching, and specific error conditions (invalid_request, unavailable). It goes beyond annotations by explaining the cold start and caching behavior, with no contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections for purpose, examples, and failure modes. It is detailed but not excessively verbose, providing all necessary operational context without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The presence of an output schema covers return format, and the description explains error responses and caching behavior. It gives an agent enough context to decide when to call this tool and what to expect. Could mention output fields, but the output schema handles that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters (keyword, limit) are fully described in the schema with defaults and examples. The description reinforces the keyword matching behavior and provides concrete usage examples, adding value beyond the schema itself. Schema coverage is 100%, so this is above the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool searches the PSA OpenSTAT catalog by keyword, explicitly contrasting with browsing level by level. The verb 'find' and resource 'PSA OpenSTAT dataset' are specific, and it distinguishes itself from sibling tools like browse_psa_catalog by emphasizing keyword-based search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies when to use this tool (when you need to find a dataset by keyword rather than browsing) and provides useful performance details (cold start delay, caching) and failure modes. However, it does not explicitly contrast with other search tools like search_hdx_datasets or search_procurement, leaving some inference to the reader.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_psic_codesPSIC industrial classification searchA
Read-onlyIdempotent

Find a PSIC code by description keyword or by code prefix.

Matches a query of only digits against the PSIC code prefix. Matches any other query by whole-word text against the class description, case-insensitive. PSA publishes the full table (roughly 1,360 rows) on one page, so the first call fetches and caches it for 24 hours. Examples:

search_psic_codes("rice") every description with "rice" as a whole word search_psic_codes("0111") every code that starts with "0111" search_psic_codes("mining", limit=5) at most 5 matches

On failure: data_status is "invalid_request" for an empty, over-long, or non-printable query, or for a limit outside 1-100. A Cloudflare challenge in place of the table gives "unavailable". A missing, empty, or partial PSIC table gives "indeterminate". Neither failure is cached, and the real error sits in caveats.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of matches to return (1-100).
queryYesDigits for a code-prefix match, or text for a whole-word match against the description, case-insensitive. 1 to 100 printable characters.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the standard read-only and idempotent annotations, the description discloses that the first call fetches and caches the full PSA table for 24 hours. It also transparently enumerates possible failure states (invalid_request, unavailable, indeterminate) and explains that failures are not cached. This goes well beyond the basic annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat long but well-structured: it opens with the core purpose, then provides examples, and finally covers failure modes. Each paragraph serves a clear function, and the content is not redundant. It is slightly verbose but justified by the need to explain caching and edge cases.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists (though not shown in the prompt), the description does not need to detail return values. It does cover important context such as caching, failure behavior, and matching rules, which is sufficient for an agent to invoke the tool and interpret results. The only minor gap is not explicitly describing the output structure, but that is covered by the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters (query and limit) are fully described in the input schema, and the description reinforces this with detailed examples of digit vs. text queries and the valid range for limit. The examples add practical clarity beyond the schema's dry descriptions, making the expected input formats unambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: find a PSIC code by description keyword or code prefix. It uses a specific verb ('find') and resource ('PSIC code'), and provides concrete examples that distinguish it from other search tools. The name and description align perfectly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the matching logic (digit prefix vs. whole-word text) and failure modes, giving agents enough context to decide when to use this tool. It does not explicitly contrast with sibling search tools, but the specific reference to PSIC codes makes the usage context clear enough for most cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

summarize_infra_spendingSummarize infrastructure spendingA
Read-onlyIdempotent

Aggregate infrastructure procurement statistics over the latest PhilGEPS window.

This tool aggregates the same infra-keyword-matched notice window search_infra_projects reads (cached 6h). rules_evaluated names which breakdowns ran, today by_category and by_region. rules_not_computable names by_funding_source, retired to an always-empty dict because PhilGEPS notices carry no funding source field. sample_size and sufficient_for_per_capita flag whether the window, today under the 500-notice threshold, is large enough for a per-100k rate. Examples:

summarize_infra_spending() summarize_infra_spending(region="ncr", year=2025)

On failure: data_status "unavailable", upstream_error true, totals zero and by_category/by_region/top_agencies empty, with the real PhilGEPS error in caveats. No validation_error path exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoFilter publish date to this calendar year. Drops an undated record and notes the dropped count in caveats.
regionNoPH region filter (partial match).
funding_sourceNoReserved for future DPWH integration; PhilGEPS notices do not expose funding source, so this filter is a no-op today.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

It discloses metadata behaviors not in annotations: a 6-hour cache, the per-capita sufficiency threshold, the fact that an undated record is dropped, and the exact failure shape (unavailable/upstream_error/real error in caveats). It also calls out the no-op funding_source behavior and retired breakdown. This goes well beyond what readOnlyHint/openWorldHint/idempotentHint tell the agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but front-loads the single-line purpose and follows with dense, high-value detail: caching, computable breakdowns, failure shape, and examples. There is no filler or tautology.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (0 required params, output schema available) and the description covers relevant call dynamics: filtering options, cache freshness, not-enough-data behavior, and failure shape. No additional information seems necessary for an agent to invoke or interpret the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the schema already describes year and region well and calls funding_source a no-op. The description adds value by showing call examples, clarifying that by_funding_source output will be empty, and linking parameters to output behavior (e.g., undated record dropped in caveats).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and resource ('Aggregate infrastructure procurement statistics over the latest PhilGEPS window') and then explicitly ties itself to the same notice window as search_infra_projects, which separates it from that search-oriented sibling. It identifies focus on aggregate infra spending, a distinct purpose from the broader procurement and project-list tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description establishes clear usage context: agent should use it to get aggregate infrastructure statistics over the cached PhilGEPS window, with examples showing valid calls (region='ncr', year=2025). It does not explicitly name when-not-to-use or alternatives, but the connection to search_infra_projects and the aggregate-vs-raw distinction is clear enough to guide selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 25 tool updatesv0.8.0
    • Addedbrowse_election_results
    • Addedcompare_areas
    • Changeddescribe_psa_dataset1 field changed
      • changedInput schema / properties / dataset_path / description
        Previous value: -"Relative path to a `.px` dataset, e.g.\n          \"1F/FY/0011F3DF010.px\". Take it from the `path` field of\n          a browse_psa_catalog dataset entry."New value: +"Relative path to a `.px` dataset, for example\n          \"1F/FY/0241F3DF013.px\". Take it from the `path` field\n          of a browse_psa_catalog dataset entry."
    • Changedget_air_quality1 field changed
      • changedInput schema / properties / location / description
        Previous value: -"City or municipality name (e.g. \"Manila\", \"Cebu City\", \"Davao\")."New value: +"City or municipality name, such as \"Manila\", \"Cebu City\", or \"Davao\"."
    • Addedget_election_return
    • Addedget_flood_forecast
    • Changedget_health_indicators1 field changed
      • changedInput schema / properties / indicator / description
        Previous value: -"Optional free-text indicator name, e.g. \"maternal mortality\",\n       \"fertility\". None returns the default headline set."New value: +"Optional free-text indicator name, for example \"maternal\n       mortality\", \"fertility\". None returns the default headline set."
    • Changedget_inflation_stats1 field changed
      • changedInput schema / properties / area / description
        Previous value: -"Region or \"Philippines\". None returns the national figure.\n  e.g. \"NCR\", \"Region VII\", \"Davao Region\"."New value: +"Region or \"Philippines\". None returns the national figure.\n  For example \"NCR\", \"Region VII\", \"Davao Region\"."
    • Changedget_labor_stats1 field changed
      • changedInput schema / properties / region / description
        Previous value: -"Accepted for API symmetry. The LFS key-indicator table is\n    national only; passing a region adds an explanatory caveat."New value: +"Accepted for API symmetry. The LFS key-indicator table is\n    national only. Passing a region adds an explanatory caveat."
    • Changedget_latest_earthquakes3 fields changed
      • addedInput schema / properties / center_lat
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Latitude of a search point. Give with center_lon and\n        radius_km to filter to events near one place instead of\n        the full recent-events list."
        +}
      • addedInput schema / properties / center_lon
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Longitude of a search point. Give with center_lat and\n        radius_km."
        +}
      • addedInput schema / properties / radius_km
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Keep only events within this distance of\n       (center_lat, center_lon). Give all three of center_lat,\n       center_lon, and radius_km together, or none of them. Each\n       returned event then carries a distance_km field."
        +}
    • Addedget_official_gazette_feed
    • Changedget_population_stats3 fields changed
      • addedInput schema / properties / psgc_code
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "A 9- or 10-digit PSGC code from resolve_ph_location.\nReaches cities, municipalities and barangays (2024 Census only).\nNot combined with region."
        +}
      • changedInput schema / properties / region / description
        Previous value: -"e.g. \"NCR\", \"Region VII\", \"Cordillera Administrative Region\".\n    None returns national total."New value: +"Region, province or highly urbanized city as PSA labels it,\nsuch as \"NCR\", \"Region VII\", \"CAR\", \"BARMM\", \"Leyte\",\n\"City of Manila\". None returns the national total."
      • changedInput schema / properties / year / description
        Previous value: -"Ignored — latest data is 2020 Census; field kept for API stability."New value: +"Census year. None picks the latest. A year PSA has no census\nfor returns validation_error with available_vintages."
    • Changedget_procurement_summary1 field changed
      • changedInput schema / properties / year / description
        Previous value: -"Filter publish date to this year."New value: +"Filter publish date to this year. Drops an undated record\nand notes the dropped count in caveats."
    • Changedget_solar_and_climate1 field changed
      • changedInput schema / properties / end_date / description
        Previous value: -"ISO date string (YYYY-MM-DD). Defaults to today."New value: +"ISO date string (YYYY-MM-DD). Defaults to today. The span\n      from start_date to end_date cannot exceed 366 days."
    • Changedget_usgs_earthquakes_ph3 fields changed
      • addedInput schema / properties / center_lat
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Latitude of a search point. Give with center_lon and\n        radius_km to filter to events near one place instead of\n        the whole PH bbox."
        +}
      • addedInput schema / properties / center_lon
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Longitude of a search point. Give with center_lat and\n        radius_km."
        +}
      • addedInput schema / properties / radius_km
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Keep only events within this distance of\n       (center_lat, center_lon). Give all three of center_lat,\n       center_lon, and radius_km together, or none of them. Each\n       returned event then carries a distance_km field."
        +}
    • Changedget_vegetation_index1 field changed
      • changedInput schema / properties / start_date / description
        Previous value: -"ISO date (YYYY-MM-DD). Defaults to ~90 days ago."New value: +"ISO date (YYYY-MM-DD). Defaults to ~90 days ago. The\n        span from start_date to end_date cannot exceed 366 days."
    • Changedget_weather_alerts1 field changed
      • changedInput schema / properties / region / description
        Previous value: -"e.g. \"NCR\", \"Region VII\", \"CALABARZON\". None returns all."New value: +"For example \"NCR\", \"Region VII\", \"CALABARZON\". None returns all."
    • Changedlist_admin_units1 field changed
      • changedInput schema / properties / offset / description
        Previous value: -"Skip this many matching units before returning results —\n    page past 500 children (e.g. Manila has 897 barangays) by\n    calling again with offset=500."New value: +"Skip this many matching units before returning results.\n    Page past 500 children (for example, Manila has 897\n    barangays) by calling again with offset=500."
    • Addedlist_pagasa_advisory_files
    • Changedquery_psa_dataset1 field changed
      • changedInput schema / properties / dataset_path / description
        Previous value: -"Relative `.px` path, e.g. \"1F/FY/0241F3DF013.px\"."New value: +"Relative `.px` path, for example \"1F/FY/0241F3DF013.px\"."
    • Addedsearch_hdx_datasets
    • Changedsearch_infra_projects2 fields changed
      • changedInput schema / properties / min_cost_php / description
        Previous value: -"Minimum approved cost in PHP (filters out null-cost\n          records when set)."New value: +"Minimum approved cost in PHP. The open notice listing\n          does not publish approved budget for almost any\n          record, so setting this today returns few or no\n          results rather than a true cost-ranked subset."
      • changedInput schema / properties / year / description
        Previous value: -"Filter publish date to this calendar year."New value: +"Filter publish date to this calendar year. Excludes records\n  with no publish date, so a year filter never returns an\n  undated record."
    • Addedsearch_psa_catalog
    • Addedsearch_psic_codes
    • Changedsummarize_infra_spending1 field changed
      • changedInput schema / properties / year / description
        Previous value: -"Filter publish date to this calendar year."New value: +"Filter publish date to this calendar year. Drops an\nundated record and notes the dropped count in caveats."
  2. 3 tool updatesv0.6.0
    • Addedbrowse_psa_catalog
    • Addeddescribe_psa_dataset
    • Addedquery_psa_dataset
  3. 10 tool updatesv0.5.0
    • Changedflag_infra_anomalies1 field changed
      • changedInput schema / properties / min_cost_php / description
        Previous value: -"Threshold for the high_cost_no_progress rule\n          (default 50,000,000 PHP)."New value: +"Threshold for the high_cost_no_published_progress rule\n          (default 50,000,000 PHP)."
    • Changedget_active_typhoons3 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  }
        +]
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedOutput schema / properties / result / type
        Removed value: -"array"
    • Changedget_historical_typhoons_ph3 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  }
        +]
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedOutput schema / properties / result / type
        Removed value: -"array"
    • Changedget_latest_earthquakes3 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  }
        +]
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedOutput schema / properties / result / type
        Removed value: -"array"
    • Changedget_usgs_earthquakes_ph3 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  }
        +]
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedOutput schema / properties / result / type
        Removed value: -"array"
    • Changedget_volcano_status3 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  }
        +]
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedOutput schema / properties / result / type
        Removed value: -"array"
    • Changedget_weather_alerts3 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  }
        +]
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedOutput schema / properties / result / type
        Removed value: -"array"
    • Changedlist_admin_units4 fields changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Skip this many matching units before returning results —\n    page past 500 children (e.g. Manila has 897 barangays) by\n    calling again with offset=500.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  }
        +]
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedOutput schema / properties / result / type
        Removed value: -"array"
    • Changedsearch_infra_projects3 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  }
        +]
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedOutput schema / properties / result / type
        Removed value: -"array"
    • Changedsearch_procurement3 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  }
        +]
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedOutput schema / properties / result / type
        Removed value: -"array"
  4. 29 tool updatesv0.4.0
    • Addedassess_area_risk
    • Addedflag_infra_anomalies
    • Addedget_active_typhoons
    • Addedget_air_quality
    • Addedget_area_profile
    • Addedget_data_freshness
    • Addedget_earthquake_bulletin
    • Addedget_health_indicators
    • Addedget_historical_typhoons_ph
    • Addedget_inflation_stats
    • Addedget_infra_project
    • Addedget_labor_stats
    • Addedget_latest_earthquakes
    • Addedget_location_hierarchy
    • Addedget_population_stats
    • Addedget_poverty_stats
    • Addedget_procurement_summary
    • Addedget_solar_and_climate
    • Addedget_usgs_earthquakes_ph
    • Addedget_vegetation_index
    • Addedget_volcano_status
    • Addedget_weather_alerts
    • Addedget_weather_forecast
    • Addedget_world_bank_indicator
    • Addedlist_admin_units
    • Addedresolve_ph_location
    • Addedsearch_infra_projects
    • Addedsearch_procurement
    • Addedsummarize_infra_spending
  5. 11 tool updatesv1.0.4
    • Removedassess_area_risk
    • Removedget_active_typhoons
    • Removedget_earthquake_bulletin
    • Removedget_latest_earthquakes
    • Removedget_population_stats
    • Removedget_poverty_stats
    • Removedget_procurement_summary
    • Removedget_volcano_status
    • Removedget_weather_alerts
    • Removedget_weather_forecast
    • Removedsearch_procurement
  6. 1 tool updatev1.0.3
    • Removedget_air_quality
  7. 12 tool updatesv1.0.2
    • Addedassess_area_risk
    • Addedget_active_typhoons
    • Addedget_air_quality
    • Addedget_earthquake_bulletin
    • Addedget_latest_earthquakes
    • Addedget_population_stats
    • Addedget_poverty_stats
    • Addedget_procurement_summary
    • Addedget_volcano_status
    • Addedget_weather_alerts
    • Addedget_weather_forecast
    • Addedsearch_procurement

TDQS

A4.3/5.0

Scored across 41 tools

Disambiguation5/5

Each tool targets a distinct data source and action—earthquake events, bulletin details, active vs historical typhoons, forecast vs alerts, and separate catalog search/query/browse functions—so there is no real ambiguity.

Naming Consistency4/5

Names overwhelmingly follow get_/search_/list_/browse_/query_ + noun with underscores; minor inconsistency from _ph suffixes on some earthquake/typhoon tools but not on others.

Tool Count3/5

The 29 described tools (41 claimed) exceed the typical 15-tool sweet spot, but the broad multi-agency Philippine civic-data scope gives most tools a distinct niche; still heavy enough to feel sprawling.

Completeness4/5

Coverage is impressively broad—health, disasters, weather, procurement, PSA/OpenSTAT, HDX, gazette, elections, location hierarchy—but compare_areas references a get_area_profile helper that is not exposed, leaving a small functional gap.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for the Philippine Standard Geographic Code (PSGC) API. Gives AI agents structured access to the full PH geographic hierarchy - regions, provinces, cities, municipalities, and barangays.
    8 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    An MCP server that connects AI agents to over 200 tools across 27 Brazilian public APIs, covering economic, legislative, transparency, and judicial data. It enables users to query and cross-reference extensive government datasets from sources like IBGE, the Central Bank, and the Brazilian Congress.
    7
    1,759
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    MCP server giving AI agents structured access to Canadian federal, provincial, and municipal government data.
    5
    59
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP Server for accessing 36 Brazilian public data sources and 1 agent, enabling AI agents to query government data on economy, legislation, transparency, judiciary, elections, environment, health, and more.
    MIT