Skip to main content
Glama
README.md
# Pollen Alert MCP Server

An MCP (Model Context Protocol) server that provides real-time pollen level alerts and hayfever mitigation tips. It uses the [Ambee API](https://www.getambee.com/) to fetch pollen data for any location worldwide, making it available to AI assistants like Claude.

This project is created based on Claude Code Course

## Features

**Tools**
- `get_coordinates` — Convert a place name into latitude and longitude
- `get_pollen_forecast` — Get current pollen counts, risk levels, and species-level breakdown for a location

**Resources**
- `pollen://mitigation-guide` — Hayfever mitigation strategies
- `pollen://allergen-info` — Common allergen types and their peak seasons

**Prompts**
- `analyze_pollen_risk` — A guided prompt that chains coordinate lookup, pollen forecast, and mitigation advice for a given place

## Prerequisites

- Python 3.14+
- [uv](https://docs.astral.sh/uv/) package manager
- An [Ambee API](https://www.getambee.com/) key

## Installation

1. Clone the repository:

```bash
git clone https://github.com/jaygaha/pollen-alert-mcp.git
cd pollen-alert-mcp
```

2. Install dependencies with uv:

```bash
uv sync
```

3. Create a `.env` file in the project root with your Ambee API key:

```bash
API_KEY=your_ambee_api_key_here
```

## Usage

### Running the server directly

```bash
uv run pollen_alert_server
```

### Configuring with Claude Desktop

Add the following to your Claude Desktop configuration file (`claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "pollen-alert": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/pollen-alert-mcp",
        "run",
        "pollen_alert_server"
      ]
    }
  }
}
```

### Configuring with Claude Code (CLI)

1. Add the server:

```bash
claude mcp add pollen-alert -- uv --directory /absolute/path/to/pollen-alert-mcp run pollen_alert_server
```

2. Verify it was registered:

```bash
claude mcp list
```

3. Start a new Claude Code session and ask naturally:

```
What are the pollen levels in Nerima, Tokyo?
```

Claude Code will automatically discover and call the `get_coordinates` and `get_pollen_forecast` tools.

> **Note:** The MCP server loads when a Claude Code session starts. If you modify the server code, you need to restart your session (`/exit` then `claude`) for changes to take effect.

### Configuring with Ollama (local models)

You can use this MCP server with locally running models via [Ollama](https://ollama.com/) using an MCP-compatible client. One option is [mcp-cli](https://github.com/wong2/mcp-cli), which bridges MCP servers to Ollama models.

1. Install an Ollama model with tool-calling support:

```bash
ollama pull llama3.1
```

2. Install mcp-cli:

```bash
npx @wong2/mcp-cli
```

3. Create an MCP configuration file (e.g. `mcp.json`):

```json
{
  "mcpServers": {
    "pollen-alert": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/pollen-alert-mcp",
        "run",
        "pollen_alert_server"
      ]
    }
  }
}
```

4. Run mcp-cli with your config:

```bash
npx @wong2/mcp-cli --config mcp.json
```

This connects the pollen alert server to your local Ollama model, allowing it to call the `get_coordinates` and `get_pollen_forecast` tools.

> **Note:** Tool-calling quality depends on the model. Models like `llama3.1`, `mistral`, and `qwen2.5` support tool use. Smaller models may not invoke tools reliably.

### Example interactions

Once connected, you can ask your AI assistant things like:

- "What are the pollen levels in Tokyo right now?"
- "Check the pollen forecast for Butwal and tell me if it's safe to go outside."
- "Use the analyze_pollen_risk prompt for Kathmandu."

## Project Structure

```
pollen-alert-mcp/
├── src/
│   ├── __init__.py
│   └── pollen_alert_server/
│       ├── __init__.py              # Entry point
│       ├── server.py                # MCP server implementation
│       └── api_response_model.py    # Pydantic data models
├── pyproject.toml
└── .env                             # API key (not committed)
```

## Architecture Note

This project intentionally uses the **low-level `Server` class** from the MCP SDK rather than the higher-level `FastMCP` wrapper. This makes the MCP protocol mechanics (JSON-RPC, tool registration, resource handling) explicit and easier to understand for beginners learning how MCP servers work.

## Future Ideas & Contributions

Here are ideas to improve and extend this project. Contributions are welcome!

### Migrate to FastMCP

Refactoring from the low-level `Server` class to [`FastMCP`](https://github.com/modelcontextprotocol/python-sdk#fastmcp) would:
- Replace manual `list_tools` / `call_tool` dispatching with simple `@mcp.tool()` decorators
- Replace `list_resources` / `read_resource` with `@mcp.resource()` decorators
- Replace `list_prompts` / `get_prompt` with `@mcp.prompt()` decorators
- Remove boilerplate `InitializationOptions` setup
- Enable `mcp dev server.py` for the MCP Inspector (currently unsupported with low-level Server)

### Pollen Alert Notifications (n8n Automation)

A detailed architecture plan for automating pollen level notifications using n8n is available in [`notification-plan.md`](./notification-plan.md). It covers scheduled pollen checks, threshold-based alerting, duplicate prevention, and notification delivery via Email, Slack, LINE, and FCM push notifications.

### Feature Ideas

- **Pollen forecast (multi-day)** — Add a tool that returns forecast data for the next 3-7 days, not just current levels
- **Allergy severity scoring** — Combine pollen counts with user-provided allergy profile (e.g., "allergic to birch and grass") to give a personalized risk score
- **Historical comparison** — Show how today's pollen levels compare to the same period last year
- **Push notifications** — Alert users when pollen levels exceed a configured threshold for their saved locations
- **Multiple data sources** — Integrate additional APIs (e.g., Google Pollen API) for cross-referencing and better accuracy
- **Caching layer** — Cache API responses (e.g., 15-minute TTL) to reduce Ambee API calls and improve response times
- **Rate limiting** — Add request throttling to stay within Ambee API limits
- **Unit tests** — Add test coverage using pytest with mocked API responses
- **SSE transport** — Add Server-Sent Events transport alongside stdio for web-based MCP clients
- **Docker support** — Add a Dockerfile for containerized deployment

## License

MIT

TDQS

A3.7/5.0

Scored across 2 tools

Disambiguation5/5

Each tool has a distinct purpose: one converts place names to coordinates, the other retrieves pollen forecasts using coordinates. There is no overlap or ambiguity.

Naming Consistency5/5

Both tool names follow a consistent verb_noun pattern with snake_case (get_coordinates, get_pollen_forecast), making them predictable and easy to understand.

Tool Count4/5

With only two tools, the server feels slightly thin, but it covers the essential workflow for a pollen alert service: location lookup and forecast retrieval. The count is reasonable for a focused domain.

Completeness4/5

The server provides the core functionality needed to get pollen alerts by location. A minor gap is the lack of a direct place-name-to-forecast tool, but the separate steps are logically sound.

Maintenance

ActivityInactive
ResponsivenessNo issues