Skip to main content
Glama
w00dbury

environment-mcp

by w00dbury
README.md
# environment-mcp

MCP (Model Context Protocol) server that proxies [Google Maps Platform Environment APIs](https://developers.google.com/maps/environment): **Air Quality**, **Pollen**, and **Weather**. Uses stdio transport and a single API key from the environment.

## Prerequisites

- Node.js 20+
- A Google Cloud project with billing enabled
- APIs enabled: **Air Quality API**, **Pollen API**, **Weather API** (APIs & Services → Library)
- An API key (APIs & Services → Credentials), with usage restricted appropriately for your setup

See the product setup guides for details: [Air Quality](https://developers.google.com/maps/documentation/air-quality/get-api-key), [Pollen](https://developers.google.com/maps/documentation/pollen/get-api-key), [Weather](https://developers.google.com/maps/documentation/weather/get-api-key).

## Install and run

```bash
npm install
npm run build
```

Set the key (do not commit it):

```bash
export GOOGLE_MAPS_API_KEY="your-key"
```

Alternatively use `GOOGLE_ENVIRONMENT_API_KEY`.

Start the server (stdio; typically launched by an MCP client, not used interactively):

```bash
npm start
```

For development with auto-reload:

```bash
npm run dev
```

## Cursor MCP configuration

After `npm run build`, add a server entry (adjust the path to your clone):

```json
{
  "mcpServers": {
    "google-environment": {
      "command": "node",
      "args": ["/absolute/path/to/environment-mcp/dist/index.js"],
      "env": {
        "GOOGLE_MAPS_API_KEY": "your-key-here"
      }
    }
  }
}
```

You can omit `env` if `GOOGLE_MAPS_API_KEY` is already set in your shell profile and Cursor inherits it (behavior depends on how Cursor is launched).

## Tools

| Tool | API |
|------|-----|
| `air_quality_current_conditions` | `POST .../v1/currentConditions:lookup` |
| `air_quality_forecast` | `POST .../v1/forecast:lookup` |
| `air_quality_history` | `POST .../v1/history:lookup` |
| `pollen_forecast` | `GET .../v1/forecast:lookup` |
| `weather_current_conditions` | `GET .../v1/currentConditions:lookup` |
| `weather_forecast_days` | `GET .../v1/forecast/days:lookup` |
| `weather_forecast_hours` | `GET .../v1/forecast/hours:lookup` |
| `weather_history_hours` | `GET .../v1/history/hours:lookup` |
| `weather_public_alerts` | `GET .../v1/publicAlerts:lookup` |

Air quality tools accept a JSON body with required `location: { latitude, longitude }` and optional fields per Google’s REST reference; other tools use typed arguments (coordinates, `days`, `hours`, `unitsSystem`, etc.).

## Linting

Uses [Ultracite](https://www.ultracite.ai/) (Biome preset):

```bash
npm run lint
npm run format
```

## Security

- Never pass the API key in tool arguments; only use environment variables.
- Restrict the key in Google Cloud Console (HTTP referrers for browser use; IP or server-only patterns for backend).

TDQS

A3.7/5.0

Scored across 9 tools

Disambiguation5/5

Each tool targets a unique combination of environmental domain (air quality, pollen, weather) and time dimension (current, forecast, history, alerts), making them clearly distinct. Even within the same domain, tools like weather_forecast_days and weather_forecast_hours are differentiated by granularity.

Naming Consistency5/5

All tool names follow a consistent lowercase_with_underscores pattern: domain_first (air_quality, pollen, weather) followed by a type modifier (current_conditions, forecast, history, alerts). There is no mixing of camelCase or other conventions.

Tool Count5/5

Nine tools is a well-scoped count for an environment API server covering three sub-domains. Each tool maps to a distinct Google API endpoint, and none are redundant or trivial, so the size feels appropriate.

Completeness5/5

The surface covers the full lifecycle of environmental data access for the included domains: current, forecast, and history for air quality; forecast for pollen; and current, forecast, history, and alerts for weather. No obvious dead ends or missing operations within the stated scope.

Maintenance

ActivityInactive
ResponsivenessNo issues