Skip to main content
Glama
scalekit-developers

mcp-use Scalekit MCP Auth

mcp-use + Scalekit MCP Auth

MCP-сервер для mcp-use, который аутентифицируется через Scalekit OAuth 2.1.

У коллег один и тот же URL сервера. Каждый пользователь входит в систему. Инструменты видят его идентичность (ctx.auth.user.id), а не общий ключ API.

Этот пример не использует @scalekit-sdk/node и не требует client id или client secret от Scalekit. Ресурсный сервер проверяет JWT против JWKS Scalekit.

Пошаговое руководство (cookbook) находится в docs/v2/typescript/server/authentication/providers/scalekit.mdx. Этот README — инструкция по запуску для этого репозитория.

[!IMPORTANT] Используйте своё окружение Scalekit. В этом репозитории только заглушки. Никогда не коммитьте .env.

Что вы получаете

  • Streamable HTTP MCP на /mcp

  • 401 + WWW-Authenticate, указывающий на метаданные защищённого ресурса RFC 9728

  • Scalekit как сервер авторизации (DCR и CIMD)

  • whoami — аутентифицированный пользователь, области (scopes) и iss / aud токена

  • greet — инструмент, который опирается на ctx.auth.user.id

Related MCP server: Access Self-Hosted MCP Server

Как клиент входит в систему

sequenceDiagram
  participant Client as MCP client
  participant Server as This server
  participant SK as Your Scalekit env

  Client->>Server: POST /mcp (no token)
  Server-->>Client: 401 + WWW-Authenticate
  Client->>Server: GET /.well-known/oauth-protected-resource/mcp
  Server-->>Client: authorization_servers = Scalekit resource issuer
  Client->>SK: Discover AS metadata, register via DCR or CIMD
  Client->>SK: User signs in and consents
  SK-->>Client: Access token (aud includes res_…)
  Client->>Server: POST /mcp Authorization: Bearer …
  Server-->>Client: Tool result scoped to ctx.auth.user.id

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

1. Зарегистрируйте MCP-сервер в Scalekit

Следуйте краткому руководству по MCP Auth со следующими значениями:

  1. Откройте панель управления Scalekit → MCP servers → Add MCP server.

  2. Дайте ему имя. Это имя появится на экране согласия.

  3. Включите динамическую регистрацию клиентов и Client ID Metadata Document (CIMD). Публичным клиентам, таким как Inspector, Claude и Cursor, нужен хотя бы один из этих параметров; оставьте оба включёнными.

  4. В дополнительных настройках установите Server URL на:

    http://localhost:3000/mcp

    Без завершающего слэша. Если этот URL задан, Scalekit записывает его в утверждение aud access-токена вместе с res_… id. Если оставить поле пустым, aud будет только res_… — пример всё равно работает.

  5. Сохраните. Скопируйте со страницы сервера:

    • Environment URL — https://<ваше-окружение>.scalekit.cloud

    • Resource ID — res_…

[!CAUTION] Если вы позже измените DCR или CIMD, переподключите MCP-клиента. Inspector и другие клиенты кэшируют метаданные сервера авторизации. Этот процесс — не кэширует.

2. Настройте этот репозиторий

git clone git@github.com:scalekit-developers/scalekit-mcpuse-example.git
cd scalekit-mcpuse-example
npm install
cp .env.example .env

Отредактируйте .env, используя свои значения. В этом репозитории нет примеров учётных данных.

SCALEKIT_ENVIRONMENT_URL=https://your-env.scalekit.cloud
SCALEKIT_RESOURCE_ID=res_xxxxxxxx
MCP_URL=http://localhost:3000/mcp

Переменная

Откуда берётся

SCALEKIT_ENVIRONMENT_URL

Панель управления → API credentials → Environment URL

SCALEKIT_RESOURCE_ID

Панель управления → MCP servers → этот сервер → res_…

MCP_URL

Должен точно совпадать с Server URL (без завершающего слэша)

Нет ни SCALEKIT_CLIENT_ID, ни SCALEKIT_CLIENT_SECRET. Ресурсный сервер проверяет только токены, которые уже выпустил Scalekit.

3. Запустите и войдите

npm run dev
  1. Откройте Inspector.

  2. Подключитесь к http://localhost:3000/mcp. Первый вызов вернёт 401; Inspector запустит вход через Scalekit.

  3. Завершите согласие в браузере.

  4. Вызовите whoami.

Вы должны увидеть usr_… id, subjectType: "user", области (scopes) типа openid / profile, а также:

{
  "iss": "https://your-env.scalekit.cloud",
  "aud": ["http://localhost:3000/mcp", "res_xxxxxxxx"]
}

iss также может быть https://ваше-окружение.scalekit.cloud/resources/res_xxxxxxxx. Этот пример принимает оба варианта, пока Scalekit мигрирует значения issuer.

Затем вызовите greet. Приветствие использует ctx.auth.user.id из проверенного токена — это шаблон для ограничения данных инструмента по пользователю.

Как работает проверка

oauth: oauthScalekitProvider({
  environmentUrl: process.env.SCALEKIT_ENVIRONMENT_URL!,
  resourceId: process.env.SCALEKIT_RESOURCE_ID!,
  resource: process.env.MCP_URL!,
}),

resourceId — это JWT aud (res_…). resource — публичный URL MCP. mcp-use помещает resource в метаданные защищённого ресурса RFC 9728. Это не вторая проверка аудитории.

Проверка

Источник

Подпись

JWKS на {environmentUrl}/keys (из живых метаданных AS, а не из угаданного пути)

iss

Корень окружения или {environmentUrl}/resources/{resourceId}

aud

Должен включать resourceId (res_…)

Идентичность

ctx.auth.user.id — это sub токена

resourceId — это граница безопасности каждого сервера. Токен, выпущенный для другого MCP-сервера в том же окружении Scalekit, должен отклоняться.

Авторизация должна жить рядом с инструментом:

async (_args, ctx) => {
  // ctx.auth.user.id is this caller — scope your data to it
  if (!ctx.auth.scopes.includes("todos:write")) {
    return { isError: true, content: [{ type: "text", text: "Missing scope" }] };
  }
};

oauth/scalekit.ts — это прототип полноценного адаптера mcp-use/oauth/scalekit. Он ещё не опубликован на npm.

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

Путь

Роль

index.ts

Сервер mcp-use, настройка OAuth, whoami и greet

oauth/scalekit.ts

Провайдер JWT + JWKS

docs/v2/.../scalekit.mdx

Cookbook: аутентификация сервера mcp-use с Scalekit

.env.example

Только заглушки

Изменение публичного URL

Если вы публикуете сервер (туннель, развёртывание, собственный хост):

  1. Установите Server URL в Scalekit как origin + /mcp (без завершающего слэша).

  2. Установите MCP_URL в ту же строку.

  3. Перезапустите процесс.

Верификатор не меняется. resourceId остаётся проверкой аудитории.

Устранение неполадок

Симптом

Вероятная причина

Сервер падает при запуске из-за SCALEKIT_* или MCP_URL

Отсутствует .env или значение пусто

Inspector никогда не запускает вход

DCR и CIMD выключены — включите хотя бы один и сохраните. Если уже включены, переподключите Inspector, чтобы сбросить кэш метаданных

Вход работает, но каждый инструмент возвращает 401

Server URL не совпадает с MCP_URL (завершающий слэш, неверный порт, http вместо https)

В whoami aud содержит только res_…

Server URL остался пустым в панели управления — это допустимо; этот пример опирается на resourceId

Нужны детали утверждений при 401

Установите MCP_USE_OAUTH_DEBUG=1 и повторите. В логах выводятся iss, aud, sub — никогда не печатается сырой токен

Scalekit также публикует руководство по устранению неполадок MCP Auth.

Безопасность

  • Не храните клиентские секреты, ключи API или личные URL окружений в этом репозитории.

  • .env игнорируется через git. Коммитьте только .env.example.

  • Этот процесс никогда не обращается к Scalekit с клиентским секретом. Он только проверяет bearer-токены.

  • MCP_USE_OAUTH_DEBUG=1 декодирует полезную нагрузку JWT для iss / aud / sub. Он не печатает сам токен.

Документация

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A remote MCP server implementation that demonstrates authentication and authorization capabilities using OAuth 2.1. This is a workshop project for learning how to build secure MCP servers with user authentication.
    1,775 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server demonstrating OAuth 2.0 authentication with Keycard's Security Token Service, providing tools for displaying the Keycard logo and retrieving authenticated user information.
    18 npm
    1
    Apache 2.0
  • F
    license
    Not graded
    quality
    C
    maintenance
    A toy MCP server demonstrating OAuth 2.1 scoped authorization with three tools for minion status, listing, and summoning.
    -