Skip to main content
Glama
sauravkumar329

Weather MCP Server

MCP-сервер погоды

Сервер Model Context Protocol, предоставляющий данные о погоде в реальном времени, защищенный аутентификацией по токену AWS Cognito OAuth 2.1 Bearer.

Реализует полную спецификацию авторизации MCP (2025-11-25):

  • RFC 9728 — Обнаружение метаданных защищенных ресурсов (PRM)

  • RFC 6750 — Использование токенов Bearer

  • RFC 7591 — Динамическая регистрация клиентов (DCR), связанная с Cognito


Архитектура

Client / AI Agent
  │
  ├─ GET  /.well-known/oauth-protected-resource   → discover auth server
  ├─ POST /register                               → dynamic client registration (optional)
  ├─ POST Cognito /oauth2/token                   → exchange credentials for JWT
  └─ POST /mcp   Authorization: Bearer <token>    → call MCP tools

Данные о погоде поступают из Open-Meteo — бесплатно, ключ API не требуется.


Related MCP server: MCP Authentication Example

Структура проекта

weather-mcp/
├── weather_mcp/
│   ├── __init__.py
│   ├── config.py       # Env var loading (COGNITO_REGION/USER_POOL_ID/DOMAIN_PREFIX, SERVER_URL)
│   ├── auth.py         # JWT validation, middleware, PRM + DCR handlers
│   ├── tools.py        # MCP instance + weather tools
│   └── main.py         # Starlette app factory + uvicorn entrypoint
├── infra/
│   └── cognito.yaml    # CloudFormation — Cognito User Pool, IAM role
├── docs/
│   └── deploy-ecs-express.md  # ECS Express Mode deployment guide
├── pyproject.toml
├── Dockerfile
├── .env.example
└── README.md

Предварительные требования

  • Python 3.13+ и uv

  • Учетная запись AWS с настроенным CLI (aws configure)

  • Docker (опционально, для контейнеризированного развертывания)


Быстрый старт

1 — Развертывание AWS Cognito

aws cloudformation deploy \
  --template-file infra/cognito.yaml \
  --stack-name weather-mcp \
  --region us-east-1 \
  --capabilities CAPABILITY_NAMED_IAM

Получите выходные значения:

aws cloudformation describe-stacks \
  --stack-name weather-mcp \
  --query "Stacks[0].Outputs" \
  --output table

2 — Настройка окружения

cp .env.example .env
# Fill in COGNITO_REGION, COGNITO_USER_POOL_ID, COGNITO_DOMAIN_PREFIX from CloudFormation Outputs

3 — Запуск

Локально:

uv sync
uv run python -m weather_mcp.main

Docker:

docker build -t weather-mcp:local .
docker run --env-file .env -p 8000:8000 weather-mcp:local

Сервер запускается по адресу http://0.0.0.0:8000.

Развертывание в AWS ECS Express Mode:

Полное руководство см. в docs/deploy-ecs-express.md — оно описывает сборку образа, отправку в ECR и создание публичного HTTPS-сервиса с автоматическим масштабированием.


API-эндпоинты

Эндпоинт

Аутентификация

Описание

GET /health

Нет

Проверка работоспособности

GET /.well-known/oauth-protected-resource

Нет

Документ обнаружения RFC 9728

POST /register

Нет

Динамическая регистрация клиентов RFC 7591

POST /mcp

Bearer token

Инструменты MCP (потоковый HTTP)


Инструменты MCP

Инструмент

Описание

get_current_weather

Текущая погода для любого местоположения по широте/долготе


Использование

Динамическая регистрация клиентов (без предварительной настройки)

# 1. Register a new client
curl -s -X POST http://localhost:8000/register \
  -H "Content-Type: application/json" \
  -d '{"client_name":"my-agent","grant_types":["client_credentials"],"scope":"weather-mcp/read"}'

# 2. Get a token
curl -s -X POST https://weather-mcp-auth.auth.us-east-1.amazoncognito.com/oauth2/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials&client_id=<CLIENT_ID>&client_secret=<CLIENT_SECRET>&scope=weather-mcp/read"

# 3. Call MCP
curl -s -X POST http://localhost:8000/mcp \
  -H "Authorization: Bearer <TOKEN>" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'

Переменные окружения

Переменная

Описание

COGNITO_REGION

Регион AWS (например, us-east-1)

COGNITO_USER_POOL_ID

ID пула пользователей Cognito

COGNITO_DOMAIN_PREFIX

Префикс домена Hosted-UI

SERVER_URL

Публичный URL этого сервера (по умолчанию: http://localhost:8000)


Как работает аутентификация

  1. Запрос поступает на /mcp без токена → сервер отвечает 401 и заголовком WWW-Authenticate, указывающим на /.well-known/oauth-protected-resource

  2. Клиент получает документ обнаружения, чтобы найти сервер авторизации Cognito

  3. Клиент получает токен доступа JWT от Cognito (через client_credentials или динамическую регистрацию клиентов)

  4. Клиент включает Authorization: Bearer <token> в последующие запросы

  5. Промежуточное ПО проверяет подпись JWT по эндпоинту JWKS в Cognito (RS256, кэшируется на 1 час)


Примечания

  • MCP-сервер привязывается к 0.0.0.0:8000 с отключенной защитой от DNS-ребиндинга (host="0.0.0.0"). Это необходимо при работе за балансировщиком нагрузки (например, ECS Express Mode ALB), где заголовок Host является публичным доменом, а не localhost.

  • При развертывании в ECS Express Mode образ закрепляется по дайджесту — см. руководство по развертыванию для получения информации о том, как его обновить.


Related MCP Connectors

Related MCP Servers