oura-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@oura-mcphow was my sleep last night?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
oura-mcp
MCP-сервер для доступа к данным Oura Ring из Claude Code и claude.ai.
Спрашиваешь «как я спал на прошлой неделе» — Claude сам вызывает нужный инструмент и получает готовую сводку, а не гору JSON.
Особенности
Один код — два транспорта.
stdioдля Claude Code локально,streamable-httpдля развёртывания на сервере. Различаются одним флагом.Сжатые ответы. По умолчанию возвращается сводка (посуточные значения + статистика с трендом), а не сырой ответ API. Полный JSON доступен через
raw=Trueу любого инструмента.Песочница из коробки. Работает на тестовых данных Oura без всякой авторизации — можно поднять и попробовать за минуту.
Устойчивость к сети. Обход пагинации
next_token, ретраи с экспоненциальным бэкоффом, внятные сообщения вместо голых кодов ответа.
Related MCP server: whoop-ai-mcp
Быстрый старт
Нужен uv. Токен Oura на этом шаге не нужен.
git clone https://github.com/AntVsl/oura_mcp && cd oura_mcp
cp .env.example .env
uv syncПроверка, что данные доходят (идёт в песочницу Oura, авторизация не нужна):
uv run python -m oura_mcp.smokeПодключение к Claude Code:
claude mcp add oura -- uv --directory /полный/путь/к/oura_mcp run oura-mcpЗатем в сессии: «покажи сводку Oura за неделю». Инструмент get_status
подтвердит, в каком режиме сервер работает.
Инструменты
Инструмент | Что отдаёт | По умолчанию |
| Оценки сна, готовности и активности сразу | 7 дней |
| Стадии сна, эффективность, HRV, пульс покоя, дыхание, температура | 7 дней |
| Только дневная оценка сна — легче, чем | 7 дней |
| Готовность, баланс HRV, отклонение температуры | 7 дней |
| Оценка активности, шаги, калории | 7 дней |
| Поминутный пульс, свёрнутый посуточно | 3 дня |
| SpO₂ во сне, индекс нарушений дыхания | 7 дней |
| Время под нагрузкой и в восстановлении | 7 дней |
| Сосудистый возраст, VO₂max | 30 дней |
| Отметки, проставленные вручную в приложении | 30 дней |
| Режим работы и состояние авторизации | — |
Общие параметры: days_back либо пара start_date/end_date
(YYYY-MM-DD), плюс raw для получения нетронутого ответа Oura.
Переход на реальные данные
Песочница отдаёт синтетику. Чтобы получить свои данные, нужно приложение Oura и разовая авторизация.
1. Зарегистрируй приложение на developer.ouraring.com/applications:
Поле | Значение |
Redirect URI |
|
Scopes |
|
Остальные поля | произвольные; для персонального приложения не проверяются |
Проходить ревью не нужно: свежее приложение работает сразу, лимит — 10 пользователей.
2. Впиши OURA_CLIENT_ID и OURA_CLIENT_SECRET в .env.
3. Пройди авторизацию — один раз:
uv run oura-mcp authКоманда поднимет локальный сервер на адресе из OURA_REDIRECT_URI, откроет
браузер и после подтверждения сохранит токены в .oura/tokens.json (права
600). Дальше сервер обновляет их сам.
4. Переключи OURA_API_MODE=production в .env.
Вспомогательное:
uv run oura-mcp auth --status # авторизован ли, сколько живёт токен
uv run oura-mcp auth --logout # забыть токеныPersonal Access Token больше не подойдёт: Oura прекратила их выпуск в декабре 2025, доступ только через OAuth2.
Refresh-токен одноразовый. При каждом обновлении Oura выдаёт новый и аннулирует прежний, поэтому два сервера с общим хранилищем выбьют друг друга из авторизации. Признак —
400с сообщением про одноразовость: лечится повторнымoura-mcp authи переходом на один живой экземпляр.
Конфигурация
Всё через .env (см. .env.example). Секреты в git не попадают.
Переменная | Назначение |
| Учётные данные приложения Oura |
| Должен совпадать с указанным в приложении |
|
|
| Часовой пояс для трактовки «сегодня». На сервере задать явно |
| Куда OAuth-флоу пишет токены. Руками не заполняется |
| Файл кэша SQLite |
Почему OURA_TZ важен: на хосте в UTC системное «сегодня» отличается от твоего,
и запрос «сон за вчера» вернёт не ту ночь.
Запуск
Один и тот же код обслуживает оба сценария — различается только транспорт.
Локально: Claude Code на этой машине
claude mcp add --scope user oura -- uv --directory /путь/к/oura_mcp run oura-mcp--scope user делает сервер видимым из любого каталога; без него он
подключится только в той папке, где выполнена команда. Проверка:
claude mcp listТранспорт stdio, сеть не задействована, ничего наружу не открывается.
Локально по HTTP: отладка транспорта
uv run oura-mcp --transport http --port 8000На loopback-адресе секрет не требуется. Здесь удобно воспроизводить то, что потом будет происходить на сервере.
Глобально: свой сервер, доступ отовсюду
Даёт доступ с любого устройства и из веб-интерфейса claude.ai. Нужны сервер с публичным IP и домен, A-запись которого уже ведёт на этот сервер.
Не разворачивай это на том же хосте, где живёт VPN: публичный HTTPS-домен на том же IP портит его репутацию и привлекает к нему внимание.
1. Подготовь секреты на сервере, в .env:
python3 -c "import secrets;print(secrets.token_urlsafe(32))"Полученную строку — в OURA_MCP_TOKEN, домен — в OURA_DOMAIN, и
OURA_TZ=Europe/Moscow (системное время сервера почти наверняка UTC).
2. Подними:
docker compose up -dCaddy сам выпустит TLS-сертификат. Наружу смотрит только он; порт MCP остаётся
внутри сети Docker. Проверка живости — curl https://твой-домен/healthz,
она не требует токена и не отдаёт данных.
3. Подключи claude.ai: Settings → Connectors → Add custom connector, URL
https://твой-домен/mcp. В разделе Request headers добавь заголовок
Authorization со значением Bearer <твой OURA_MCP_TOKEN> — целиком, вместе
со словом Bearer и пробелом.
Аутентификация по request headers у Claude в стадии beta и раскатана не на всех. Если раздела в диалоге нет, дождись доступа — обходной путь требует полноценного OAuth 2.1-сервера на стороне MCP.
4. Подключи Claude Code с любой машины:
claude mcp add --scope user --transport http oura https://твой-домен/mcp --header "Authorization: Bearer ТВОЙ_ТОКЕН"Без заголовка или с неверным токеном эндпоинт отвечает 401 и до данных не
допускает.
Что выбрать
stdio локально | HTTP на сервере | |
Доступ из Claude Code на этой машине | да | да |
Доступ с других устройств | нет | да |
Доступ из claude.ai в браузере | нет | да |
Нужен домен и сервер | нет | да |
Данные покидают машину | нет | да, на твой сервер |
Держи один живой экземпляр: refresh-токен Oura одноразовый, и два сервера с общим хранилищем токенов будут выбивать друг друга из авторизации. Подняв удалённый, переключи на него и локальный Claude Code — вариантом из шага 4.
Безопасность
.env, хранилище токенов и кэш перечислены в.gitignore. Проверяй перед коммитом:git status --porcelain.Refresh-токен Oura одноразовый — при каждом обновлении выдаётся новый. Два экземпляра сервера с одним токеном будут выбивать друг друга из авторизации. Держи один живой инстанс: когда поднимешь удалённый, направляй на него и Claude Code.
HTTP-эндпоинт закрыт общим секретом
OURA_MCP_TOKEN(сравнение постоянного времени). Модель доступа намеренно простая: один секрет, один владелец, разграничения между пользователями нет.Сервер не запустится на внешнем адресе без секрета — вместо тихой отдачи медданных в открытый интернет он откажется стартовать. Проверить локально:
uv run oura-mcp --transport http --host 0.0.0.0.Путь
/healthzоткрыт без токена намеренно — он нужен reverse proxy и не отдаёт ничего, кромеok.Заголовок
Authorizationвычищается из логов Caddy.
Разработка
uv run pytestТесты идут на зафиксированных ответах и сеть не трогают.
x86_64 macOS: cryptography с версии 49 не публикует бинарное колесо под
эту платформу и пытается собраться из Rust-исходников. В pyproject.toml стоит
прицельное ограничение на 48.0.0; Linux и нативный arm64 оно не затрагивает.
Это касается не только Intel-машин. Если Homebrew установлен в /usr/local
(а не в /opt/homebrew), то на Apple Silicon весь Python-стек всё равно
x86_64 и идёт через Rosetta. Проверить: file $(which python3).
Перебои сети: если запросы к api.ouraring.com рвутся с
SSL_ERROR_SYSCALL или таймаутом, дело обычно не в сервере. Клиент делает 4
попытки с бэкоффом; если не помогает — включи VPN.
Лицензия
MIT
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.
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/AntVsl/oura_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server