Перейти к содержимому
Hogin Hogin
Назад

MCP-сервер Intervals.icu в Claude через Pomerium

6 мин чтения

Мы хотели, чтобы 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

Pomerium — это identity-aware reverse proxy (Zero Trust). С 2025 года он умеет работать как OAuth 2.1-сервер авторизации перед MCP, то есть берёт на себя весь логин-флоу, который требует спецификация MCP от клиента:

Итог: сервер доступен из любого 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 есть проекты — изолированные пространства со своими инструкциями, знаниями и подключёнными коннекторами.

Проект в Claude как персональный тренер

Собирается так:

Пример инструкций для проекта-тренера:

Ты — мой тренер по триатлону. Перед советом всегда сверяйся с
фактическими данными из Intervals.icu (нагрузка, форма, сон, HRV).
Цель: олимпийская дистанция в сентябре. Ограничение: правое колено,
избегаем плиометрики. Отвечай кратко: что делать на этой неделе и
почему, со ссылкой на конкретные цифры из моих тренировок. Если
данных не хватает — сначала вызови нужный инструмент, потом отвечай.

Теперь любой чат внутри проекта стартует с этим контекстом: «Как мне скорректировать объём на этой неделе?» — и Claude сначала подтянет реальный CTL/ATL через MCP, сверится с планом из знаний и даст ответ по делу, а не общими словами.

Итог

Цена — один раз поднять MCP-сервер и маршрут в Pomerium. Выгода — Claude получает реальные тренировки, при этом API-ключ не покидает периметр, доступ закрыт вашим IdP с MFA и отзывается одним кликом. А проект-тренер превращает разовые ответы в постоянного помощника, который помнит ваши цели и смотрит в актуальные цифры. Тот же подход переносится на любой другой MCP: подключайте данные к Claude, но всегда через identity-aware прокси, а не голым токеном в интернете.


Поделиться:

Следующая статья
Свой Matrix + Element: мессенджер, который принадлежит вам