IQAir MCP Server
IQAir MCP Server
MCP-сервер, предоставляющий данные о качестве воздуха в реальном времени с IQAir — создан путём обратной разработки сайта IQAir (официальный API-ключ не требуется).
Он был создан для страницы качества воздуха в Джакарте (https://www.iqair.com/id/air-quality/indonesia/jakarta/jakarta), но работает для любой локации IQAir.
Что возвращает
Для локации вы получаете:
US AQI и основной загрязнитель
Показатели по каждому загрязнителю: PM2.5, PM10, O₃, SO₂ (AQI + концентрация)
Погоду: температура, влажность, давление, ветер
Количество отчитывающихся станций
Прогнозы на 7 дней и 72 часа
Координаты / часовой пояс
Инструменты
Инструмент | Описание |
| Полный отчёт по Джакарте (текущие данные + прогнозы). |
| Только текущие условия в Джакарте (легче). |
| Прогноз по Джакарте ( |
| Любая локация, например |
path — это сегмент после /<locale>/air-quality/ в URL IQAir — country/state/city.
Как это работает (реверс-инжиниринг)
IQAir — это приложение React Router v7 (Remix) на Vercel. Каждая страница качества воздуха предоставляет свои данные загрузчика по тому же URL с суффиксом .data:
GET /id/air-quality/indonesia/jakarta/jakarta.data?_routes=routes%2F%24(locale).air-quality.%24Ответ закодирован в формате turbo-stream (пул с индексными ссылками и отложенными promise-чанками), декодируется с помощью turbo_stream.py.
Анти-бот: контрольная точка безопасности Vercel
Сайт защищён контрольной точкой Vercel. В ходе обратной разработки мы обнаружили:
Обычные
requests/httpx→ HTTP 429 (страница с вызовом).curl_cffiс имитацией TLS Chrome → всё ещё 429 (требуется JS/WASM-вызов, а не только совпадение TLS-отпечатка).Даже валидный cookie
_vcrcs, воспроизведённый из не-браузерного клиента → 429 (проверяется TLS/JA3-отпечаток).Безголовый Chromium → контрольная точка никогда не снимается (безголовый режим обнаруживается).
С головой Chromium → снимается за ~3 с.
Поэтому клиент (iqair_client.py) управляет Chromium с головой и постоянным профилем: он один раз решает контрольную точку, кэширует cookie _vcrcs в профиле и выполняет запрос .data из контекста страницы, чтобы использовались реальный TLS-стек браузера и решённый cookie. Окно размещается за пределами экрана, чтобы не мешать вам.
Установка
cd iqair-mcp
pip install -r requirements.txt
python -m playwright install chromiumТребуется сеанс рабочего стола / дисплей (браузер должен работать с головой).
Запуск
python server.py # stdio (for MCP clients)
python server.py --transport sse # SSE on http://localhost:8000Регистрация в MCP-клиенте
{
"mcpServers": {
"iqair": {
"command": "python",
"args": ["C:\\path-to-mcp\\iqair-mcp\\server.py"]
}
}
}Файлы
server.py— FastMCP-сервер, предоставляющий инструменты.iqair_client.py— клиент на основе браузера (решение контрольной точки + загрузка + нормализация).turbo_stream.py— декодер формата.dataот React Router (turbo-stream).requirements.txt— зависимости.
Устойчивость к отключениям RDP
Контрольная точка вынуждает использовать браузер с головой, а безэкранный Chromium с головой может потерять поверхность рендеринга (и умереть) при отключении или блокировке сеанса RDP. Сервер переживает это на двух уровнях:
Автовосстановление — если вызов получает ошибку "target/browser closed", клиент уничтожает мёртвый браузер и прозрачно перезапускает его один раз.
Сторожевой heartbeat — фоновый поток пингует браузер каждые
keepalive_seconds(по умолчанию 60 с); если он мёртв или не отвечает, поток упреждающе пересобирает и заново решает контрольную точку, так что отключение никогда не оставляет мёртвый браузер в ожидании следующего вызова инструмента. Тёплые вызовы после восстановления возвращаются за ~1–2 с без повторного решения.
Дополнительно для текущего пользователя отключены заставка и автоблокировка (HKCU\Control Panel\Desktop → ScreenSaveActive=0, ScreenSaveTimeOut=0), чтобы подключённый сеанс не блокировал сам себя под браузером. Это настраивается для каждого пользователя и обратимо.
Полностью безконсольные настройки (поддержание живого рабочего стола без подключённых пользователей) требуют прав администратора — либо машинная политика
MaxDisconnectionTime=0вHKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services, либо запланированная задачаtsconна консоль. Здесь они не применяются (нет повышения прав для этой доменной учётной записи); сторожевой heartbeat + автовосстановление покрывают случай отключения без них.
Примечания и ограничения
Первый вызов за сеанс оплачивает разовый запуск браузера ~3 с + решение контрольной точки; последующие вызовы используют тёплую сессию.
Подключённый сеанс рабочего стола по-прежнему рекомендуется; сторожевой heartbeat обрабатывает кратковременные отключения/блокировки пересборкой, но на машине должен быть сеанс, чтобы вообще отображать браузер с головой.
Данные — это то, что IQAir публикует в данный момент (значения обновляются в реальном времени).
Это зависит от внутренней (недокументированной) конечной точки данных IQAir; изменения на сайте могут потребовать обновления идентификатора маршрута или декодера.
Для личного/образовательного использования — соблюдайте условия обслуживания IQAir.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Air Quality MCP — wraps air-quality-api.open-meteo.com (free, no auth)
EPA AirNow MCP — official US real-time AQI + forecast (free key)
WAQI MCP — World Air Quality Index (free key)
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Nanparam/iqair-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server