メインコンテンツにスキップ

MCP サーバーでの MCP Auth の設定

最新の MCP 仕様 (2025-06-18) では、MCP サーバーは外部認可サーバーによって発行された アクセス トークン (Access token) を検証する リソースサーバー として動作します。

MCP Auth を設定するには、主に 2 つのステップが必要です:

  1. 認可サーバーメタデータの設定 - どの認可サーバーが MCP サーバー用の有効なトークンを発行できるかを定義し、MCP クライアントに アクセス トークン (Access token) の取得先を案内します
  2. 保護リソースメタデータの設定 - MCP サーバーをサポートするスコープ付きの保護リソースとして定義します

ステップ 1: 認可サーバーメタデータの設定

メタデータの自動取得

認可サーバーメタデータを設定する最も簡単な方法は、well-known URL からメタデータを取得する組み込み関数を利用することです。プロバイダーが次のいずれかの標準に準拠している場合:

fetchServerConfig を使い、issuer の URL を指定することで自動的にメタデータを取得できます:

import { fetchServerConfig } from 'mcp-auth';

// 認可サーバーメタデータの取得
const authServerConfig = await fetchServerConfig('https://auth.logto.io/oidc', { type: 'oidc' }); // または 'oauth'

issuer にパスが含まれる場合、OAuth 2.0 と OpenID Connect で挙動が少し異なります:

  • OAuth 2.0:well-known URL は issuer の ドメイン に付加されます。例:issuer が https://my-project.logto.app/oauth の場合、well-known URL は https://auth.logto.io/.well-known/oauth-authorization-server/oauth となります。
  • OpenID Connect:well-known URL は issuer に直接付加されます。例:issuer が https://my-project.logto.app/oidc の場合、well-known URL は https://auth.logto.io/oidc/.well-known/openid-configuration となります。

オンデマンドディスカバリー

Cloudflare Workers などのエッジランタイムでトップレベルの async fetch が許可されていない場合は、オンデマンドディスカバリーを利用できます。issuertype を指定するだけで、初回利用時に自動的にメタデータが取得されます:

const authServerConfig = { issuer: '<issuer-url>', type: 'oidc' }; // または 'oauth'

その他の認可サーバーメタデータ設定方法

カスタムデータ変換

場合によっては、プロバイダーから返されるメタデータが期待される形式に準拠していないことがあります。プロバイダーが準拠していると確信できる場合は、transpileData オプションでメタデータを使用前に変換できます:

import { fetchServerConfig } from 'mcp-auth';

const authServerConfig = await fetchServerConfig('<auth-server-issuer>', {
  type: 'oidc',
  transpileData: (data) => ({ ...data, response_types_supported: ['code'] }), 
});

これにより、MCP Auth で使用する前にメタデータオブジェクトを編集できます。たとえば、フィールドの追加・削除や値の変更、別形式への変換などが可能です。

特定の URL からメタデータを取得

プロバイダーが標準以外の特定のメタデータ URL を持つ場合も、同様に利用できます:

import { fetchServerConfigByWellKnownUrl } from 'mcp-auth';

const authServerConfig = await fetchServerConfigByWellKnownUrl('<metadata-url>', { type: 'oidc' }); // または 'oauth'

特定の URL からカスタムデータ変換付きでメタデータを取得

プロバイダーのレスポンスが不正または期待されるメタデータ形式に準拠していない場合も、プロバイダーが準拠していると確信できれば、設定オプションでメタデータを変換できます:

const authServerConfig = await fetchServerConfigByWellKnownUrl('<metadata-url>', {
  type: 'oidc',
  transpileData: (data) => ({ ...data, response_types_supported: ['code'] }), 
});

メタデータを手動で指定

プロバイダーがメタデータの取得をサポートしていない場合は、メタデータオブジェクトを手動で指定できます:

const authServerConfig = {
  metadata: {
    issuer: '<issuer-url>',
    // メタデータフィールドは camelCase で記述
    authorizationEndpoint: '<authorization-endpoint-url>',
    // ... その他のメタデータフィールド
  },
  type: 'oidc', // または 'oauth'
};

ステップ 2: 保護リソースメタデータの設定

認可サーバーメタデータの設定後、保護リソースメタデータを定義して MCPAuth をリソースサーバーとして初期化します。

このステップでは、RFC 9728 (OAuth 2.0 Protected Resource Metadata) 仕様に従い、MCP サーバーを保護リソースとして記述します:

import { MCPAuth } from 'mcp-auth';

// リソース識別子の定義
const resourceIdentifier = 'https://api.example.com/notes';

// リソースサーバーモードで MCPAuth を初期化
const mcpAuth = new MCPAuth({
  protectedResources: {
    metadata: {
      resource: resourceIdentifier,
      authorizationServers: [authServerConfig], // ステップ 1 で取得した config を利用
      scopesSupported: ['read:notes', 'write:notes'],
    },
  },
});

複数のリソースがある場合は、各リソースごとにメタデータ設定を持つ保護リソース config の配列を指定できます。

上記の設定で基本的なセットアップは完了です。より高度なメタデータパラメータについては RFC 9728 を参照してください。

ステップ 3: 保護リソースメタデータエンドポイントのマウント

ルーターをマウントして保護リソースメタデータエンドポイントを提供します。エンドポイントのパスはリソース識別子のパスコンポーネントによって自動的に決定されます:

  • パスなしhttps://api.example.com/.well-known/oauth-protected-resource
  • パスありhttps://api.example.com/notes/.well-known/oauth-protected-resource/notes
import express from 'express';

const app = express();

const mcpAuth = new MCPAuth({/* ... */});

app.use(mcpAuth.protectedResourceMetadataRouter());