Ph Civic Data MCP vs Semantic Scholar MCP | AllMCPs
Side-by-Side Model Context Protocol Comparison
Ph Civic Data MCP vs Semantic Scholar MCP
In-depth architectural comparison of the Ph Civic Data MCP and Semantic Scholar MCP MCP servers. Compare execution transports, security boundaries, tool capabilities, quality scores, and ready-to-paste client installation snippets for Claude, Cursor, Windsurf, and VS Code.
At a Glance & Executive Verdict
Ph Civic Data MCP
Research · Local stdio
Quality: 60/100 (Good) | Auth: No auth required
Semantic Scholar MCP
Research · Local stdio
Quality: 61/100 (Good) | Auth: No auth required
Verdict Summary: Choose Ph Civic Data MCP if you need specialized Research tools running via a local process. Choose Semantic Scholar MCP if your workspace requires Research integration with local subprocess execution. Both servers can be configured concurrently in your client's mcpServers manifest.
Which MCP Server Should You Choose?
Choose Ph Civic Data MCP when:
You need dedicated capabilities in the Research domain.
You prefer local stdio subprocess transport architecture.
Your security boundary fits: No auth required (Free / Open Source).
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.
get_latest_earthquakes
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.
Ready-to-Paste Client Configurations
Paste either (or both) of these JSON server blocks into your client config file (e.g. claude_desktop_config.json or ~/.cursor/mcp.json).
Ph Civic Data MCP is categorized under Research and uses a local stdio subprocess. In contrast, Semantic Scholar MCP belongs to Research using local stdio subprocess. Select Ph Civic Data MCP when you need capabilities focused on research and Semantic Scholar MCP when you require tools for research.
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.
get_volcano_status
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.
get_weather_forecast
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.
get_active_typhoons
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.
get_weather_alerts
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.
search_procurement
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.
get_procurement_summary
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.
resolve_ph_location
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.
list_admin_units
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.
get_location_hierarchy
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.
+29 more tools listed on main page
Semantic Scholar MCP Tools (14)
semantic_scholar_search_papers
Search for academic papers.
Relevance-ranked keyword search over 200M+ papers; supports boolean
operators (AND, OR, NOT) and quoted phrases, plus year, field-of-study,
publication-type, open-access, and citation-count filters. Page with
offset/limit (max 100 per call). For sorted or very large result sets
use semantic_scholar_bulk_search; to search inside paper full text use
semantic_scholar_snippet_search; to resolve one known title use
semantic_scholar_match_paper. Returns Markdown by default,
response_format='json' for raw JSON.
semantic_scholar_get_paper
Get paper details. Accepts: S2 ID, DOI:xxx, ARXIV:xxx, PMID:xxx, CorpusId:xxx
Returns title, abstract, authors, venue, year, citation counts, TLDR,
and open-access PDF link for one paper, e.g. paper_id='ARXIV:1706.03762'.
Set include_citations / include_references to also list citing and
referenced papers (fetched in parallel, 1-100 each). Results are cached
in memory for 5 minutes; an unknown ID raises a not-found error. Unkeyed
requests are throttled to 1 req/s (10 req/s with SEMANTIC_SCHOLAR_API_KEY)
and 429/502/503 responses retry automatically with backoff. Returns
Markdown by default, response_format='json' for raw JSON. To fetch many
papers at once use semantic_scholar_bulk_papers.
semantic_scholar_search_authors
Search for academic authors by name.
Example: query='Yoshua Bengio'. Several distinct researchers can share a
name, so confirm identity with semantic_scholar_get_author (affiliations,
h-index, publications) before attributing work; to list the authors of a
specific paper use semantic_scholar_paper_authors instead. Page with
offset/limit (max 100 per call, default 10). Returns Markdown by default,
response_format='json' for raw JSON.
semantic_scholar_get_author
Get author profile with optional publications list.
semantic_scholar_recommendations
Get paper recommendations based on a seed paper.
Provide one paper you already know (e.g. paper_id='ARXIV:1706.03762') and
receive up to `limit` similar papers. from_pool picks the candidate pool:
'recent' (default, recently published papers from all fields) or 'all-cs'
(computer-science papers of any age). When steering with several positive
or negative examples, use semantic_scholar_multi_recommend instead. An
unknown seed ID raises a not-found error; unkeyed requests are throttled
to 1 req/s (10 req/s with SEMANTIC_SCHOLAR_API_KEY) and 429/502/503
responses retry automatically with backoff. Returns Markdown by default,
response_format='json' for raw JSON.
semantic_scholar_bulk_papers
Retrieve multiple papers in a single request (max 500).
semantic_scholar_bulk_search
Search papers with sorting and cursor-based pagination for large result sets.
Unlike regular search, supports sorting (e.g., by citation count) and
returns a continuation token for paging through all results.
semantic_scholar_export_citation
Export a citation for a paper in BibTeX format.
Use once you have a paper ID (from semantic_scholar_search_papers or
semantic_scholar_match_paper), e.g. paper_id='DOI:10.18653/v1/N18-3011'.
Returns the BibTeX entry as plain text - there is no response_format
option. Raises an error for an unknown ID, a paper without citation data,
or any format other than 'bibtex'.
semantic_scholar_match_paper
Find the single best paper matching a title string. Returns match score.
semantic_scholar_paper_authors
Get full author profiles for a paper's authors.
Unlike the abbreviated author list embedded in semantic_scholar_get_paper
results, this returns each author's complete profile - affiliations,
h-index, paper and citation counts - plus author IDs usable with
semantic_scholar_get_author. Example: paper_id='DOI:10.18653/v1/N18-3011'.
Authors are returned in listed order (limit 1-1000, default 100). Returns
Markdown by default, response_format='json' for raw JSON.
semantic_scholar_author_batch
Retrieve multiple authors in a single request (max 1000).
semantic_scholar_multi_recommend
Get recommendations using multiple positive and negative example papers.
Use instead of semantic_scholar_recommendations when steering with more
than one example: results resemble positive_paper_ids and are pushed away
from negative_paper_ids. Example:
positive_paper_ids=['ARXIV:1706.03762', 'DOI:10.18653/v1/N19-1423'],
negative_paper_ids=['ARXIV:1409.0473']. Accepts 1-100 positive and up to
100 negative IDs in any supported paper-ID format; malformed IDs raise an
error before any request is made. Returns up to `limit` (1-500, default
10) papers, Markdown by default or response_format='json' for raw JSON.
Philippine government data as agent-callable tools: PHIVOLCS earthquakes + volcano alerts, PAGASA weather + typhoons, PhilGEPS procurement, PSA 2020 Census population + poverty, AQICN air quality. Install: uvx ph-civic-data-mcp.