Мы хотели, чтобы Claude видел реальные тренировки из Intervals.icu и давал советы по плану, а не общие фразы. Решение — поднять MCP-сервер, закрыть его identity-aware прокси Pomerium и подключить как коннектор. А чтобы советы были по делу — собрать в Claude отдельный проект-тренер с инструкциями. Ниже — как мы это сделали и почему именно так.
Table of contents
Open Table of contents
Что такое MCP и зачем он тут
MCP (Model Context Protocol) — это открытый протокол, через который Claude обращается к внешним инструментам и данным: вызывает функции, читает ресурсы, получает структурированный ответ. Грубо говоря, это «USB-порт» для языковой модели: вместо того чтобы копировать выгрузки вручную, вы даёте Claude инструмент, и он сам достаёт нужное.
Intervals.icu — платформа для анализа тренировок (вело, бег, плавание): активности, wellness, календарь, планы. У неё есть открытый API, а к нему — несколько готовых MCP-серверов от сообщества (Python и TypeScript). Сервер переводит запросы Claude в вызовы Intervals.icu API и возвращает данные в понятном модели виде.
Проблема: куда девать секреты
Самый простой путь — запустить MCP-сервер локально в Claude Desktop и положить API-ключ в конфиг. Работает, но плохо масштабируется: ключ лежит в открытом виде на каждой машине, нет единой точки контроля доступа, а подключиться из веба или с телефона нельзя — сервер живёт только на вашем ноутбуке.
Нам нужен был remote MCP-сервер: один экземпляр, доступный из Claude в браузере и в приложениях, но при этом не торчащий в интернет голым. Кто угодно, зная URL, не должен дёргать ваши тренировки. Значит, перед сервером нужна авторизация.
Что меняет Pomerium
Pomerium — это identity-aware reverse proxy (Zero Trust). С 2025 года он умеет работать как OAuth 2.1-сервер авторизации перед MCP, то есть берёт на себя весь логин-флоу, который требует спецификация MCP от клиента:
- Claude не хранит секреты. API-ключ Intervals.icu остаётся на MCP-сервере за прокси. Claude получает только короткоживущий токен сессии.
- Вход через ваш IdP. Pomerium аутентифицирует пользователя через Google, Okta, Keycloak — что у вас уже есть, с MFA.
- Политики доступа. Доступ к маршруту получает только нужный email или группа. Можно блокировать «разрушающие» инструменты по имени.
- Dynamic Client Registration. Claude как MCP-клиент сам регистрируется по OAuth — руками client_id заводить не нужно.
Итог: сервер доступен из любого Claude, но за ним стоит полноценный Zero Trust-периметр, а не один статичный токен в заголовке.
Старый путь против нового
| Критерий | Локальный MCP + ключ в конфиге | Remote MCP за Pomerium |
|---|---|---|
| Где живёт API-ключ | В открытом конфиге на каждой машине | На сервере, за прокси |
| Доступ из веба/телефона | Нет, только Claude Desktop | Да, любой клиент Claude |
| Аутентификация | Нет (или сам ключ) | OAuth 2.1 + ваш IdP + MFA |
| Контроль доступа | Нет | Политики по email/группе |
| Отзыв доступа | Перевыпуск ключа везде | Один клик в политике |
| Аудит входов | Нет | Логи Pomerium |
Что нужно, чтобы подключить
Предполагаем, что Pomerium у вас уже развёрнут и привязан к IdP. Дальше — три шага.
1. Получить доступы Intervals.icu. В Settings → Developer создайте API key. Athlete ID видно в URL: intervals.icu/athlete/i12345/... — это i12345.
2. Запустить MCP-сервер (пример с готовым community-образом). Ключ и ID отдаём через переменные окружения — в Claude они не попадут:
services:
intervals-mcp:
image: ghcr.io/mvilanova/intervals-mcp-server:latest
environment:
API_KEY: "${INTERVALS_API_KEY}"
ATHLETE_ID: "i12345"
expose:
- "8000"
3. Добавить маршрут в Pomerium с блоком mcp, который помечает route как MCP-сервер и включает OAuth-флоу:
routes:
- from: https://intervals-mcp.example.com
to: http://intervals-mcp:8000/mcp
name: Intervals.icu MCP
mcp:
server: {}
policy:
and:
- email:
is: [email protected]
Если бы сам сервер ходил в стороннее API по OAuth (например, GitHub), сюда добавился бы блок mcp.server.upstream_oauth2 с client_id, client_secret, scopes и endpoint. Для Intervals.icu это не нужно — там ключ.
4. Подключить коннектор в Claude. В Settings → Connectors → Add custom connector укажите URL https://intervals-mcp.example.com. Claude откроет окно входа Pomerium, вы аутентифицируетесь через IdP — и инструменты появятся в чате.
Как проверить, что работает
Прямой запрос к серверу без токена должен упираться в редирект на логин Pomerium, а не отдавать данные:
curl -i https://intervals-mcp.example.com/mcp
# ожидаем 302/401 на Pomerium, а не 200 с JSON
А в самом Claude после подключения коннектора спросите: «Покажи мои последние 5 активностей из Intervals.icu». Если в ответе реальные тренировки с датами и мощностью — связка собрана.
Проект в Claude как личный тренер
MCP даёт данные, но тренер — это ещё и контекст: ваши цели, история травм, методика. Чтобы не повторять это в каждом чате, в Claude есть проекты — изолированные пространства со своими инструкциями, знаниями и подключёнными коннекторами.
Собирается так:
- Создайте проект (
Projects → New project), назовите, например, «Тренер». - Custom instructions — это системный промпт проекта. Здесь задаётся роль и правила.
- Project knowledge — загрузите файлы: текущий план, целевые гонки, зоны пульса/мощности, ограничения по здоровью. Claude держит это в контексте каждого чата.
- Коннектор Intervals.icu включён в проекте — тренер видит живые данные, а не только статичные файлы.
Пример инструкций для проекта-тренера:
Ты — мой тренер по триатлону. Перед советом всегда сверяйся с
фактическими данными из Intervals.icu (нагрузка, форма, сон, HRV).
Цель: олимпийская дистанция в сентябре. Ограничение: правое колено,
избегаем плиометрики. Отвечай кратко: что делать на этой неделе и
почему, со ссылкой на конкретные цифры из моих тренировок. Если
данных не хватает — сначала вызови нужный инструмент, потом отвечай.
Теперь любой чат внутри проекта стартует с этим контекстом: «Как мне скорректировать объём на этой неделе?» — и Claude сначала подтянет реальный CTL/ATL через MCP, сверится с планом из знаний и даст ответ по делу, а не общими словами.
Итог
Цена — один раз поднять MCP-сервер и маршрут в Pomerium. Выгода — Claude получает реальные тренировки, при этом API-ключ не покидает периметр, доступ закрыт вашим IdP с MFA и отзывается одним кликом. А проект-тренер превращает разовые ответы в постоянного помощника, который помнит ваши цели и смотрит в актуальные цифры. Тот же подход переносится на любой другой MCP: подключайте данные к Claude, но всегда через identity-aware прокси, а не голым токеном в интернете.