Skip to main content
Glama
mihey3000

Shopping List MCP Server

by mihey3000
README.md
# MCP списка покупок

Самостоятельный MCP-сервис. Он не открывает SQLite и не содержит бизнес-логику:
все операции выполняются через REST веб-приложения.

## Режимы авторизации

На сервере MCP работает как OAuth 2.1 Resource Server. Клиент получает
access token у Keycloak и передаёт его как `Authorization: Bearer <token>`.
Сервер публикует метаданные защищённого ресурса MCP, а затем проверяет токен
через Keycloak Introspection: активность, issuer, audience, scope и срок
действия. Статический токен допускается только в локальном режиме разработки.

## Запуск с OAuth 2.1

Сначала запустите приложение из репозитория `shopping-list-app` на порту `8000`.
Затем в этом каталоге:

```bash
../shopping-list-app/.venv/bin/python -m pip install -e ".[dev]"
cp .env.example .env
# Заполните MCP_OAUTH_* значениями из Keycloak.
set -a; source .env; set +a
../shopping-list-app/.venv/bin/python -m mcp_adapter.server
```

MCP будет доступен по `http://127.0.0.1:8001/mcp/`.

Для удалённого приложения укажите публичные HTTPS-адреса:

```bash
SHOPPING_APP_URL=https://app.example.com \\
MCP_RESOURCE_SERVER_URL=https://mcp.example.com/mcp \\
../shopping-list-app/.venv/bin/python -m mcp_adapter.server
```

Конфигурация Keycloak и сценарий для пользователя `reviewer` — в
[`docs/keycloak.md`](docs/keycloak.md).
Выгрузка MCP как самостоятельного systemd-сервиса без Docker — в
[`deploy/README.md`](deploy/README.md).

## Локальная разработка без Keycloak

Этот режим нужен только для быстрых локальных smoke-тестов. Он не реализует
OAuth discovery и не должен попадать в серверную конфигурацию.

```bash
MCP_AUTH_MODE=development \\
MCP_AUTH_TOKEN='длинный-случайный-токен' \\
../shopping-list-app/.venv/bin/python -m mcp_adapter.server
```

## Проверка

```bash
../shopping-list-app/.venv/bin/python -m pip install -e ".[dev]"
../shopping-list-app/.venv/bin/python -m pytest
export MCP_AUTH_MODE=development
export MCP_AUTH_TOKEN='длинный-случайный-токен'
../shopping-list-app/.venv/bin/python scripts/mcp_smoke.py
```

В этом локальном режиме каждый HTTP-запрос должен передавать тот же токен:

```http
Authorization: Bearer <MCP_AUTH_TOKEN>
```