sg-haze-rain-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@sg-haze-rain-mcphow's the haze right now, and can I run at 6?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
🌫️ sg-haze-rain-mcp
Ask your AI agent "how's the haze?" and get Singapore's live PSI, PM2.5 and rain, straight from NEA, for exactly where you are.
Every haze season, Singaporeans refresh the NEA app, squint at five regional numbers and try to remember what "Unhealthy" means for a 6 pm run. sg-haze-rain-mcp puts that knowledge inside the AI tools you already have open. It is a zero-config Model Context Protocol server for Claude Code, Codex, Claude Desktop, Cursor, VS Code, Windsurf, Zed and any other MCP client.
🧭 Knows where you are. Geolocates your public IP and picks the nearest of NEA's five PSI regions. Or pass a region, coordinates or an IP explicitly.
🏥 Speaks NEA's language. Every reading comes with the official band and the three-tier health advisory (general public · elderly, pregnant women and children · chronic lung or heart conditions).
🌧️ Rain, not just haze. Nearest three rain gauges with 5-minute totals, the 2-hour area nowcast, and how many of ~90 gauges are wet island-wide.
🔑 No API key, no account. Pure public data. One
npxcommand and you are done.🌏 English and Chinese labels and advisories, per call or by default.
🤖 Agent-friendly. Human-readable text plus
structuredContentJSON in every result, so an agent can quote the summary or branch on the numbers.
> how's the haze right now, and can I run at 6?
🌫️ Singapore haze — 28 Sept 2026, 21:46 SGT
Location: Bishan, Singapore → nearest PSI region: central (located via public IP)
24-hr PSI: 108 — Unhealthy (101–200)
1-hr PM2.5: 119 µg/m³ — Elevated (Band II)
24-hr PM2.5: 63 µg/m³ · 24-hr PM10: 72 µg/m³
Health advisory (Unhealthy):
• General public: Reduce prolonged or strenuous outdoor physical exertion.
• Elderly, pregnant women, children: Minimise prolonged or strenuous outdoor physical exertion.
• Chronic lung / heart conditions: Avoid prolonged or strenuous outdoor physical exertion.
All regions (24-hr PSI): north 75 · south 105 · east 90 · west 101 · central 108
☀️ No rain nearby — 21:45 SGT
• Macritchie Reservoir (1.9 km): 0 mm • Lower Peirce Reservoir (2.1 km): 0 mm • Upper Peirce (2.6 km): 0 mm
2-hour forecast Bishan: Cloudy — 9.30 pm to 11.30 pm
Island-wide: 0/89 stations reporting rainQuick start
Requires Node.js 18.17+ (node --version). Nothing else: no sign-up, no key.
claude mcp add --scope user sg-haze-rain -- npx -y github:ericwang915/sg-haze-rain-mcpPrefer Chinese labels by default:
claude mcp add --scope user --env SG_HAZE_LANG=zh sg-haze-rain -- npx -y github:ericwang915/sg-haze-rain-mcpRun /mcp inside Claude Code to confirm the server is connected with five tools. To share with a team, commit a project-level .mcp.json instead.
codex mcp add sg-haze-rain -- npx -y github:ericwang915/sg-haze-rain-mcpor in ~/.codex/config.toml:
[mcp_servers.sg_haze_rain]
command = "npx"
args = ["-y", "github:ericwang915/sg-haze-rain-mcp"]
# env = { SG_HAZE_LANG = "zh" }Add to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\):
{
"mcpServers": {
"sg-haze-rain": {
"command": "npx",
"args": ["-y", "github:ericwang915/sg-haze-rain-mcp"]
}
}
}Use the one-click badges at the top, or paste the same command / args pair into that client's MCP config (.cursor/mcp.json, .vscode/mcp.json, …):
{ "command": "npx", "args": ["-y", "github:ericwang915/sg-haze-rain-mcp"] }# pin to a release tag
npx -y "github:ericwang915/sg-haze-rain-mcp#v0.1.0"
# install once, then reference the binary
npm install -g github:ericwang915/sg-haze-rain-mcp
claude mcp add sg-haze-rain -- sg-haze-rain-mcp
# hack on it
git clone https://github.com/ericwang915/sg-haze-rain-mcp.git && cd sg-haze-rain-mcp
npm install # builds dist/ via prepare
claude mcp add sg-haze-rain -- node "$PWD/dist/index.js"The first npx run downloads and builds (about 20 s); later starts come from the npx cache and are instant.
Things to ask
"How's the haze right now?"
"Is it safe for my kids to play outside this afternoon?"
"Will it rain in the next two hours in Jurong?"
"Compare PSI across all regions."
"What's the 4-day outlook?"
"Should I bring an umbrella to Changi at 5 pm?"
Related MCP server: data-gov-sg
Tools
Tool | Purpose | Key fields in |
| One call: haze + rain + 2-hour forecast for your spot. Start here. |
|
| 24-hr PSI, 1-hr PM2.5, 24-hr PM2.5 / PM10, NEA band, advisory, all five regions, pollutant sub-indices. |
|
| Nearest three gauges (5-minute totals), 2-hour area forecast, island-wide wet-station count. |
|
|
|
|
| Shows the location and PSI region the other tools will use, and how it was decided. |
|
All tools take the same optional inputs: region (north · south · east · west · central), lat + lon, ip, lang (en · zh).
One prompt ships too: haze_check (activity: "run 5 km at 6pm") asks the assistant for a plain-language go / no-go based on the current readings.
How it works
flowchart LR
A[MCP client<br/>Claude Code · Codex · Cursor …] -- stdio --> S[sg-haze-rain-mcp]
S --> L{Where is the caller?}
L -- region given --> R[Region centroid]
L -- lat/lon given --> C[Coordinates]
L -- otherwise --> IP[Public IP → city<br/>ipwho.is ⟶ ipapi.co]
R & C & IP --> N[Nearest PSI region<br/>+ nearest gauges / area]
N --> F[NEA real-time feeds<br/>data.gov.sg v2]
F --> B[NEA bands +<br/>health advisory]
B --> ALocation resolution is strictly ordered: an explicit region wins, then lat/lon, then a given ip, then the machine's own public IP. If the IP lands outside Singapore or the lookup fails, the server falls back to a default region and says so in the reply, so the agent never silently reports the wrong place.
Feeds are cached in-process for 60 s. data.gov.sg rate-limits bursts with HTTP 429; the client retries with backoff, honours Retry-After, and if the feed still refuses it serves the last good copy it holds rather than failing a "how is the haze" question.
Data
Everything comes from the National Environment Agency (NEA), published on Singapore's open-data platform data.gov.sg. No key, same data as the NEA app.
Feed | Endpoint ( | Refresh |
24-hr PSI, 24-hr PM2.5 / PM10, pollutant sub-indices, 5 regions |
| hourly |
1-hr PM2.5, 5 regions |
| hourly |
Rainfall, 5-minute totals, ~90 gauges |
| every 5 min |
2-hour area forecast, 47 areas |
| every 30 min |
24-hour forecast, general + regional periods |
| several times daily |
4-day outlook |
| daily |
NEA bands, as reported
24-hr PSI
PSI | Band | General public |
0–50 | Good | Normal activities |
51–100 | Moderate | Normal activities |
101–200 | Unhealthy | Reduce prolonged or strenuous outdoor exertion |
201–300 | Very Unhealthy | Avoid prolonged or strenuous outdoor exertion |
> 300 | Hazardous | Minimise outdoor activity; N95 for anyone outdoors for hours |
Replies also include the stricter guidance NEA gives for the elderly, pregnant women, children, and people with chronic lung or heart disease.
1-hr PM2.5 (µg/m³), NEA's indicator for the coming hours: 0–55 Normal (I) · 56–150 Elevated (II) · 151–250 High (III) · > 250 Very High (IV).
Privacy
With no location inputs, the server asks a public IP-geolocation service where your public IP is: ipwho.is first, ipapi.co as fallback. Both are free and keyless. Only the returned coordinates and city name are used; nothing is stored. Resolution is city-level, and a VPN or corporate egress will move you.
Do not want that call at all?
SG_HAZE_IP_LOOKUP=off(optionally withSG_HAZE_DEFAULT_REGION=west), oralways pass
regionorlat/lonfrom the client.
Requests to NEA / data.gov.sg carry no information about you; the feeds are identical for everyone.
Configuration
Variable | Default | Effect |
|
|
|
|
| Region used when location is unknown or outside Singapore |
|
|
|
|
| How long a fetched feed is reused |
| data.gov.sg v2 URL | Point at a mirror or a test server |
Pass them with --env KEY=value in claude mcp add, an env table in Codex's config.toml, or an env object in JSON configs.
Development
npm install # installs and builds
npm run build # tsc → dist/
npm test # build + stdio smoke test against the live feeds
node dist/index.js --helptest/smoke.mjs speaks raw JSON-RPC to the built server, lists the tools and calls each one with explicit regions or coordinates. It sets SG_HAZE_IP_LOOKUP=off, so running the tests never geolocates your machine. CI runs it on Node 18, 20 and 22.
src/index.ts stdio entry point, --help / --version
src/server.ts tool + prompt definitions, text formatting (en / zh)
src/nea.ts NEA feed client: camel/snake normalisation, cache, 429 handling
src/geo.ts region / coords / IP resolution, haversine nearest-neighbour
src/bands.ts PSI and PM2.5 bands and NEA health advisoriesRoadmap
UV index, air temperature, humidity and wind from the same NEA feed family
Haze trend: compare the current PSI with 3 and 6 hours ago
Optional HTTP / SSE transport for hosted deployments
More languages for labels and advisories (Malay, Tamil)
Have a use case? Open an issue or see CONTRIBUTING.md.
FAQ
Does it need npm? It needs Node.js 18.17+. npx ships with Node, so if you can run Claude Code or Codex you already have everything.
Why five regions and not my street? NEA publishes PSI for north, south, east, west and central only. Rain, however, is gauge-level, so the nearest three gauges are usually within 2–3 km.
Is this official? No. It relays NEA's published data unchanged. For official advisories see haze.gov.sg and nea.gov.sg.
I am outside Singapore. The server notices, uses the default region, and tells the agent so. Pass region to pick one deliberately.
License
MIT. Data © National Environment Agency, Singapore, under the Singapore Open Data Licence.
If this saves you a trip to the NEA app, a ⭐ helps other Singaporeans find it.
Available Tools
5 toolsget_forecastSingapore weather forecastA
NEA forecast for the caller's area/region. horizon: '2h' (area nowcast), '24h' (default; general + regional periods) or '4d' (island-wide outlook).
| Name | Required | Description | Default |
|---|---|---|---|
| ip | No | Geolocate this IP instead of the machine's own public IP. | |
| lat | No | Latitude, if the caller already knows where they are (skips IP lookup). | |
| lon | No | Longitude, paired with lat. | |
| lang | No | Language for labels and health advice. Defaults to SG_HAZE_LANG or 'en'. | |
| region | No | Force a PSI region instead of locating the caller: north, south, east, west or central. | |
| horizon | No | Forecast horizon. Default 24h. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the default location source (caller's area) and horizon semantics, which is useful, but says nothing about read-only nature, response size/format, or behavior when geolocation fails.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the resource and scope, followed immediately by the horizon mapping. Every clause carries information; nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter read tool with no annotations and no output schema, the description covers the horizon and location dimensions well but omits any indication of what the response looks like or what happens with the PSI region/haze-related fields. Adequate but with a clear gap around return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely enriches the horizon parameter beyond the schema's terse 'Forecast horizon. Default 24h.' by explaining what each value returns (area nowcast vs general/regional periods vs island-wide outlook).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'NEA forecast for the caller's area/region', which tells the agent exactly what it returns and whose location it uses. It doesn't explicitly distinguish itself from siblings like weather_now or get_rain, so sibling differentiation is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the three horizon values and marks 24h as the default, which implies the choice depends on the lookahead needed. But it never says when to prefer this over weather_now or get_rain, and gives no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hazeSingapore haze (PSI / PM2.5)A
Current haze for the caller's nearest PSI region: 24-hr PSI, 1-hr PM2.5, 24-hr PM2.5/PM10, the NEA band and health advisory, plus all five regions for comparison. Data: NEA via data.gov.sg, refreshed hourly.
| Name | Required | Description | Default |
|---|---|---|---|
| ip | No | Geolocate this IP instead of the machine's own public IP. | |
| lat | No | Latitude, if the caller already knows where they are (skips IP lookup). | |
| lon | No | Longitude, paired with lat. | |
| lang | No | Language for labels and health advice. Defaults to SG_HAZE_LANG or 'en'. | |
| region | No | Force a PSI region instead of locating the caller: north, south, east, west or central. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses provenance (NEA via data.gov.sg) and freshness ('refreshed hourly'), plus the fact that all five regions are returned. It omits any auth requirements, failure behavior when geolocation or IP lookup fails, and defaults beyond what the schema states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the scope (nearest PSI region) front-loaded and provenance/freshness trailing. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly enumerates the returned values (24-hr PSI, 1-hr PM2.5, 24-hr PM2.5/PM10, band, advisory, all five regions). No annotations exist, so more on permissions or geolocation fallback would close the remaining gap, but for a read-only atmospheric data lookup this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents ip, lat, lon, lang, and region with enums and defaults. The description adds nothing parameter-specific, which matches the baseline 3 when structured fields do the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Current haze for the caller's nearest PSI region') and enumerates the returned metrics, so the tool's function is unambiguous. It never names or contrasts against siblings (weather_now, get_rain, get_forecast, locate_me), which is the only thing separating it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'current haze for the caller's nearest PSI region' but there is no explicit when-to-use, when-not, or alternative routing (e.g., vs weather_now or locate_me for geolocation). An agent must infer the context from the purpose statement alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rainSingapore rain nowA
Is it raining near the caller? Uses NEA's 5-minute rain-gauge network (nearest three stations) plus the 2-hour area forecast; also counts wet stations island-wide.
| Name | Required | Description | Default |
|---|---|---|---|
| ip | No | Geolocate this IP instead of the machine's own public IP. | |
| lat | No | Latitude, if the caller already knows where they are (skips IP lookup). | |
| lon | No | Longitude, paired with lat. | |
| lang | No | Language for labels and health advice. Defaults to SG_HAZE_LANG or 'en'. | |
| region | No | Force a PSI region instead of locating the caller: north, south, east, west or central. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden and does well: it reveals the geolocation-by-nearest-stations method, the forecast blending, and the island-wide wet-station count. It omits auth/rate-limit facts, but the methodological transparency is a real value-add.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence answers the core question first and then layers sources; no filler, nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, yet the description conveys what the call yields (local rain status, forecast, island-wide count) and how it locates the caller. That covers the essentials for calling it correctly, with only return-format specifics left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented in the schema, including the lat/lon, lang, and region semantics. The description adds no parameter guidance beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Answering 'Is it raining near the caller?' plus naming the exact data sources (NEA 5-minute rain-gauge network, nearest three stations, 2-hour area forecast) gives a precise verb+resource. This clearly separates it from get_forecast, get_haze, and weather_now.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies current-condition usage but never states when to pick this over get_forecast or weather_now, nor any exclusions. Sibling routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
locate_meLocate caller in SingaporeA
Resolve the caller's location (public IP by default) to coordinates and the nearest NEA PSI region. Useful to check what the other tools will use before calling them.
| Name | Required | Description | Default |
|---|---|---|---|
| ip | No | Geolocate this IP instead of the machine's own public IP. | |
| lat | No | Latitude, if the caller already knows where they are (skips IP lookup). | |
| lon | No | Longitude, paired with lat. | |
| lang | No | Language for labels and health advice. Defaults to SG_HAZE_LANG or 'en'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden but only provides a moderate amount: it discloses the default behavior (public IP) and that it also resolves to an NEA PSI region. It doesn't mention latency, whether it makes network calls, error handling, or what happens if geolocation fails. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and then the rationale. No waste, though it could be slightly tighter. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param, no-annotation, no-output-schema tool, the description gives a basic overview but leaves gaps: it doesn't explain what the return value looks like (coordinates + region name?), nor does it cover error cases or how the ip/lat/lon overrides interact. It's minimally sufficient but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents every parameter (ip, lat, lon, lang) including defaults and enums. The description adds little beyond reiterating the default IP lookup. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: resolve the caller's location (public IP by default) into coordinates and the nearest NEA PSI region. This clearly distinguishes it from the sibling weather tools (weather_now, get_haze, etc.) by framing it as the geolocation resolver.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: "Useful to check what the other tools will use before calling them." This tells the agent when to reach for it (as a prelude to other tools). However, it doesn't name specific alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
weather_nowSingapore weather now (haze + rain)A
One-call summary for the caller's location in Singapore: 24-hr PSI and 1-hr PM2.5 with NEA's health advisory, whether it is raining nearby, and the 2-hour forecast. Location comes from the caller's public IP unless region / lat+lon / ip is given.
| Name | Required | Description | Default |
|---|---|---|---|
| ip | No | Geolocate this IP instead of the machine's own public IP. | |
| lat | No | Latitude, if the caller already knows where they are (skips IP lookup). | |
| lon | No | Longitude, paired with lat. | |
| lang | No | Language for labels and health advice. Defaults to SG_HAZE_LANG or 'en'. | |
| region | No | Force a PSI region instead of locating the caller: north, south, east, west or central. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses location resolution defaults and overrides, plus the inclusion of NEA health advisory data. But it omits rate limits, data freshness, caching behavior, error handling, and output format expectations, leaving meaningful gaps for a five-parameter tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler, front-loading the core summary and outputs. The second sentence efficiently covers the location-resolution fallback logic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description must carry the context, and it does well: it enumerates the returned data (PSI, PM2.5, advisory, rain, forecast) and explains location sourcing. It could be slightly more complete by noting the effect of the lang parameter on labels and health advice, but overall it is strong for this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the per-parameter descriptions already do most of the work, establishing a baseline of 3. The description adds integrative precedence semantics: 'Location comes from the caller's public IP unless region / lat+lon / ip is given,' which clarifies how the optional location parameters interact beyond their individual schema docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states specific data returned: 24-hr PSI, 1-hr PM2.5, NEA health advisory, nearby rain, and 2-hour forecast. It clearly identifies itself as a one-call aggregate for Singapore, distinguishing it from sibling tools like get_haze, get_rain, and get_forecast that provide individual components.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'One-call summary' implies this tool is a convenience aggregator, suggesting when it is useful over separate calls. However, there is no explicit guidance on when to prefer this over get_haze, get_rain, get_forecast, or locate_me, and no exclusions are stated. Usage is therefore implied rather than clearly specified.
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.
5 tool updates
v0.1.0- First observed
get_forecast - First observed
get_haze - First observed
get_rain - First observed
locate_me - First observed
weather_now
TDQS
Scored across 5 tools
The three get_* tools target distinct data (haze/PSI, rain, forecast), but weather_now is a composite summary that duplicates all of them, creating genuine overlap about when to call the aggregate vs. the specific tools. Descriptions do clarify intent, keeping it from being worse than moderate ambiguity.
Four tools follow a verb_object pattern (get_haze, get_rain, get_forecast, locate_me), but weather_now breaks the convention with a noun_first form. The deviation is minor and all names remain readable.
Five tools is well-scoped for a focused Singapore weather/haze server, with a clear summary tool plus targeted drill-downs. Each tool earns its place.
The surface covers location resolution, haze/PSI, rain, forecast, and an aggregate summary, giving good lifecycle coverage for the domain. Only marginal extras (e.g. historical data or alert subscriptions) are absent, which agents can work around.
Maintenance
Related MCP Connectors
data.gov.sg MCP — Singapore open data + real-time environment/transport feeds
Air Quality MCP — wraps air-quality-api.open-meteo.com (free, no auth)
The official Model Context Protocol server for Ambee. It gives any MCP-compatible AI assistant — Claude, ChatGPT, Cursor, VS Code, Ollama, and more direct access to live air quality, pollen, and weather data. To get started, including information on signing up and obtaining your Ambee key, check out the Ambee documentation on https://docs.ambeedata.com
Singapore property & financial data APIs for AI agents. 27 MCP tools. x402 micropayments.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceReal-time Singapore government data for AI agents. Weather forecasts, air quality (PSI/PM2.5), HDB carpark availability, and taxi supply from data.gov.sg.3 npm1ISC
- AlicenseNot gradedqualityBmaintenanceEnables access to Singapore government open data and real-time environment/transport feeds including weather, air quality, taxi availability, and traffic incidents.151 npmMIT
- FlicenseNot gradedqualityCmaintenanceWraps NEA's 2-hour weather forecast API to provide rain alerts for central Singapore areas, enabling automations for rain detection.1-
- FlicenseNot gradedqualityCmaintenanceProvides current weather conditions and forecasts for Singapore from official NEA APIs, enabling users to query real-time weather data and multi-day forecasts through natural language.-