mcpField
M
MCP Tools

MCP Tools

ローカル
github.com/clerk開発ツール526 日前に更新

MCP Tools について

MCP Toolsは、アプリケーションに認証付きMCP対応を追加するための、MCP SDKベースのTypeScriptライブラリです。クライアント接続とサーバーエンドポイント向けに、OAuthフロー、永続セッションストア、フィードバック収集などを提供します。

主な機能

  1. 01クライアントとサーバーのユーティリティ
  2. 02OAuthクライアント接続フロー
  3. 03保護対象リソースメタデータの生成
  4. 04Express、Hono、Next.jsアダプター
  5. 05Redis、Postgres、SQLite、ファイルストア
  6. 06エージェントのフィードバック送信ツール

活用シーン

  1. 01アプリケーションへの認証付きMCP対応の追加
  2. 02OAuthによるユーザーとMCPエンドポイントの接続
  3. 03フレームワークアダプターを使ったMCPエンドポイントの構築
  4. 04リクエストをまたぐクライアントセッションの永続化

MCP 対応

このライブラリは、クライアント接続とツール呼び出し、および認証に対応したサーバーエンドポイントという、MCPの両側の機能を提供します。サーバー側には、保護対象リソースメタデータと任意のエージェント向けフィードバックツールがあります。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

MCP ツール

MCP TypeScript SDKを基盤に構築されたライブラリです。MCP サーバーやクライアントに認証機能付きの MCP を実装しやすくします。

MCP とは?

Claude、ChatGPT、Cursor などの AI アプリケーションが、通常はアカウントにサインインしなければアクセスできない個人情報へのアクセス許可を求められるようにするプロトコルです。たとえば、メールや非公開の GitHub リポジトリなどが該当します。

これにより、通常はアクセスできないコンテキストや機能を AI アプリケーションに提供できます。たとえば、非公開リポジトリ内のコードをコンテキストとして質問に回答させたり、内容を確認したうえで、あなたに代わってメールを書いて送信させたりできます。仕組みは次のようなものです。

MCP の仕組みを 3 つのステップで示す図:1)AI アプリが Gmail への接続許可を求める、2)ユーザーが許可する、3)AI アプリが Gmail のデータにアクセスできるようになる

この仕組みには大きな価値があると考えています。これまでアクセスできなかったさまざまな情報に AI を使ってアクセスできるようになり、ユーザーがアクセスできる情報や実行できる操作を管理できる、安全な方法だからです。MCP の普及に伴い、どのような新しい AI の活用方法が実現するのか楽しみにしています。MCP をアプリケーションに統合しやすくするため、このライブラリを開発しました。

クライアントとサーバーの使い分け

MCP には 2 つの役割があります。

  • クライアントは、別のサービスへのアクセスを必要とする側です。上の例では、Gmail へのアクセスを必要とする Claude が該当します。
  • サーバーは、クライアントがアクセスしたいものを提供する側です。上の例では Gmail が該当します。「リソースサーバー」または「MCP サーバー」と呼ばれることもあります。

このライブラリには両方の役割で使えるツールがあります。まず、自分が構築するのがクライアントなのかサーバーなのかを明確にしてください。それぞれのユースケースについて、個別に説明します。

注記: Web 開発では、「クライアント」と「サーバー」という用語は、フロントエンド(ブラウザー)とバックエンド(Web サーバー)を指す場合がよくあります。ここではその意味ではないため、混同しないようにしてください。

フレームワーク別のドキュメント

お使いのフレームワークに応じた詳しい実装ガイドと例については、以下を参照してください。

  • Express.js の統合 - Express.js で MCP サーバーを構築するための完全なガイド
  • Hono の統合 - Hono とエッジランタイムで MCP サーバーを構築するための完全なガイド
  • Next.js の統合 - Next.js で MCP サーバーとクライアントの両方を構築するための完全なガイド
目次
ガイド:サーバーの構築

MCP 対応を追加したいサーバーを構築する場合は、@clerk/mcp-tools/server のインポートパスを使用してください。

保護されたリソースのメタデータ

MCP 仕様における最新の認証フローが正しく機能するには、サーバーで「保護されたリソースのメタデータ」と呼ばれる静的なメタデータファイルを公開する必要があります。このファイルはRFC 9728で定義されています。

このライブラリには、そのようなメタデータファイルをすばやく生成するツールが用意されています。使用例を以下に示します。

import { generateProtectedResourceMetadata } from '@clerk/mcp-tools/server';

const result = generateProtectedResourceMetadata({
  resourceUrl: 'https://myapp.com/current-route',
  authServerUrl: 'https://auth.example.com',
});

.well-known/oauth-protected-resource にルートを設定し、サーバー上のそのルートからこの結果を返すようにしてください。

アプリの認証にClerkを使用している場合は、設定を簡単にするヘルパーを利用できます。

import { generateClerkProtectedResourceMetadata } from '@clerk/mcp-tools/server';

const result = generateClerkProtectedResourceMetadata({
  publishableKey: process.env.CLERK_PUBLISHABLE_KEY,
  resourceUrl: 'https://myapp.com/current-route',
});

保護されたリソースのメタデータハンドラーのフレームワーク固有の実装については、以下を参照してください。

認可サーバーのメタデータ

NOTE: まだ完全には実装されていません

MCP 仕様の旧バージョンでは、MCP サーバーに対して、RFC 8414で定義されている「認可サーバーのメタデータ」ドキュメントを別途公開することが求められていました。ほとんどのデプロイでは、保護されたリソースのメタデータを公開し、独自のメタデータエンドポイントを持つ認可サービスを使用する場合、このエンドポイントは不要になっています。ただし、カスタムまたは組み込みの認可サーバーを使用する場合や、古い MCP クライアントを使用する場合は、依然として必要になることがあります。

認証にClerkを使用する場合は、Clerk Frontend API からメタデータを取得し、認可サーバーのメタデータエンドポイントから返してください。

import { fetchClerkAuthorizationServerMetadata } from '@clerk/mcp-tools/server';

// Return this result from <your-app>/.well-known/oauth-authorization-server
const result = await fetchClerkAuthorizationServerMetadata({
  publishableKey: process.env.CLERK_PUBLISHABLE_KEY,
});

フレームワーク固有の実装については、以下を参照してください。

MCP エンドポイントの作成

MCP プロトコルの通信を実際に処理する MCP エンドポイントを作成するには、フレームワークごとにリクエストオブジェクトとレスポンスオブジェクトの処理方法が異なり、これらは MCP プロトコルの実装に欠かせないため、フレームワーク固有のアダプターを使用する必要があります。

  • Express.js:@clerk/mcp-tools/express の streamableHttpHandler を使用してください。詳しくはExpress.js ガイドを参照してください。
  • Hono:@clerk/mcp-tools/hono の streamableHttpHandler を使用してください。詳しくはHono ガイドを参照してください。
  • Next.js:Next.js のルートハンドラーで Vercel の MCP アダプターを使用してください。詳しくはNext.js ガイドを参照してください。

これらのアダプターは MCP プロトコルの詳細を処理し、認証システムと連携します。

エージェントからのフィードバック収集

MCP サーバーを使うエージェントが、作業中に行き詰まったり、回避策が必要になったり、ツールが分かりにくいと感じたりすることがあります。@clerk/mcp-tools/feedback は、エージェントが問題を報告できる submit_feedback ツールを追加します。報告は Clerk インスタンスに保存され、Clerk Dashboard のインスタンスの Feedback タブに表示されます。

import { submitFeedbackTool } from '@clerk/mcp-tools/feedback';
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';

function createServer() {
  const server = new McpServer({ name: 'my-app', version: '1.0.0' });
  server.registerTool(...submitFeedbackTool({ secretKey: process.env.CLERK_SECRET_KEY! }));
  // ...register your own tools
  return server;
}
  • secretKey には、報告の保存先となる Clerk インスタンスのシークレットキー(sk_...)を指定する必要があります。空の場合、submitFeedbackTool は例外をスローするため、環境変数が設定されていないと起動時に失敗します。
  • エージェントは、タスクの説明、問題の種類(missing、broken、confusing、idea のいずれか)、タスクの結果、試したことと発生した問題を報告します。
  • 各報告ではサーバーが発生元として記録されます。デフォルトではリクエストのホストが使われますが、server: { name, version } を渡して独自に指定することもできます。
  • 各報告では、MCP クライアントがリクエストとともに送信するクライアント情報からエージェント名が記録されます。クライアント情報がない場合は、HTTP の User-Agent ヘッダーが使われます。汎用 HTTP ライブラリやブラウザー(node や Mozilla など)は名前として使われず、接続時にのみ自身を識別するクライアント(stdio で一般的)は名前なしで表示されます。
  • リクエストが verifyClerkToken(たとえば mcpAuthClerk 経由)で認証された場合、サインインしているユーザーの ID と OAuth クライアント ID が各報告に付加されます。verifyClerkToken は結果に extra.verifiedBy: 'clerk' を付けます(@clerk/mcp-tools/server の isClerkAuthInfo で確認できます)。それ以外の検証処理によるユーザー ID は送信されません。
  • エージェントは、事前にユーザーへ確認せずに報告を送信します。報告には、ユーザーから依頼された内容のエージェントによる要約、実行したツール呼び出し、エラーが含まれ、ユーザー ID が付与されている場合はその ID と紐付けられます。この点をユーザーに提供するプライバシー情報に記載してください。
  • Clerk は報告内で検出したシークレットを削除し、インスタンスごとに 1 時間あたり最大 100 件の報告を受け付けます。
  • 認証なしのパブリック MCP エンドポイントでは、誰でもこのツールを呼び出して誤解を招く報告を送信でき、インスタンスの 1 時間あたり 100 件の上限を使い切る可能性があります。可能な場合は、認証やその他のアクセス制御で保護してください。
  • 報告を保存できない場合、ツールはエージェントに再試行しないよう伝え、レスポンスのステータスを console.error でログに記録します。Clerk へのリクエストは 10 秒でタイムアウトします。
  • このモジュールには zod(3.25 以降、または 4)が必要です。MCP SDK でもすでに必要とされています。
ガイド:クライアントの構築

AI アプリケーションに MCP との互換性を組み込むには、まずユーザーが MCP サービスに接続できるようにします。これは、https://example.com/mcp のような MCP 対応サーバーの URL を指定するだけで開始できます。通常、アプリにはユーザーが MCP エンドポイントを入力できるテキストフィールドを実装するか、あらかじめエンドポイント URL が設定された統合機能を用意し、ボタンをクリックすると MCP 接続フローが開始されるようにします。

ただし、SDK を使って実際に MCP 接続を確立するのはかなり手間がかかるため、これを簡単にするためのツールを用意しています。

フレームワークに依存しないクライアントの作成

コアユーティリティを使って MCP クライアントを作成する方法は次のとおりです。

import { createDynamicallyRegisteredMcpClient } from '@clerk/mcp-tools/client';
import { createRedisStore } from '@clerk/mcp-tools/stores/redis';

// Create a persistent store (use appropriate store for your environment)
const store = createRedisStore({ url: process.env.REDIS_URL });

export async function initializeMCPConnection(mcpEndpoint: string) {
  const { connect, sessionId } = createDynamicallyRegisteredMcpClient({
    mcpEndpoint,
    oauthScopes: 'openid profile email',
    oauthRedirectUrl: 'https://yourapp.com/oauth_callback',
    oauthClientUri: 'https://yourapp.com',
    mcpClientName: 'My App MCP Client',
    mcpClientVersion: '0.0.1',
    redirect: (url: string) => {
      // Implement redirect logic for your framework
      window.location.href = url;
    },
    store,
  });

  // Connect to the MCP endpoint
  await connect();

  return { sessionId };
}
OAuth コールバックの処理

ユーザーが OAuth フローを完了した後、コールバックを処理する必要があります。

import { completeAuthWithCode } from '@clerk/mcp-tools/client';

export async function handleOAuthCallback(code: string, state: string) {
  const result = await completeAuthWithCode({
    state,
    code,
    store,
  });

  // OAuth flow is now complete
  return result;
}
MCP ツールの呼び出し

認証が完了したら、MCP ツールを呼び出せます。

import { getClientBySessionId } from '@clerk/mcp-tools/client';

export async function callMCPTool(sessionId: string, toolName: string, args: any) {
  const { client, connect } = getClientBySessionId({
    sessionId,
    store,
  });

  await connect();

  const toolResponse = await client.callTool({
    name: toolName,
    arguments: args,
  });

  return toolResponse;
}

動作する例を含む、フレームワークごとの完全な実装については、次を参照してください。

ストア

クライアントに MCP 機能を実装するには、永続ストレージが必要です。理由は次のとおりです。

  • MCP フローは、少なくとも 3 つの異なるサーバーエンドポイント(MCP クライアントの初期化、OAuth コールバック、MCP リクエスト)にまたがって動作します。これらのサーバーエンドポイントは、共有メモリープールを持たない別々のサーバーレス関数またはエッジ関数にデプロイされる可能性があります。
  • MCP 接続は長時間実行されることを想定しているため、「セッション」を維持する必要があります。長時間実行されるセッションでインメモリストレージに依存するのは、一般に非常に悪い考え ™️ です。アプリのスケールに伴ってメモリ要件が際限なく膨らみ、サーバーの再起動などでメモリが消去されると、すべてのセッションが即座に無効になるためです。

そのため、各クライアント関数にはストアアダプターを渡す必要があります。組み込みのストアアダプターがいくつか用意されています。

ファイルシステムストア(開発用)
import fsStore from '@clerk/mcp-tools/stores/fs';

一時ファイルを使用するため、高速で簡単に利用でき、ローカルでの開発やテストには十分です。ただし、ファイルはいつでも削除される可能性があるため、本番環境には適していません。

本番用ストア

本番環境では、次のいずれかの永続ストアを使用してください。

Redis ストア
import { createRedisStore } from '@clerk/mcp-tools/stores/redis';

const store = createRedisStore({
  url: process.env.REDIS_URL,
});
Postgres ストア
import { createPostgresStore } from '@clerk/mcp-tools/stores/postgres';

const store = createPostgresStore({
  connectionString: process.env.DATABASE_URL,
});
SQLite ストア
import { createSqliteStore } from '@clerk/mcp-tools/stores/sqlite';

const store = createSqliteStore({
  filename: './mcp-sessions.db',
});
カスタムストアの実装

別の種類のストアを使用する場合は、次のシンプルなインターフェースに準拠して独自のストアを実装できます。

type JsonSerializable =
  | null
  | boolean
  | number
  | string
  | JsonSerializable[]
  | { [key: string]: JsonSerializable };

interface McpClientStore {
  write: (key: string, data: JsonSerializable) => Promise<void>;
  read: (key: string) => Promise<JsonSerializable>;
}

組み込みストアには便利な追加メソッドがいくつかありますが、動作に必要なのは read と write だけです。

リファレンスドキュメント

上記の例は、ツールの実装方法を示す ガイド のようなものです。さらに詳しく知りたい方向けに、このセクションでは、このパッケージが公開する各ツール、その引数、および返される値について説明します。

スコープ:@clerk/mcp-tools/client
  • createKnownCredentialsMcpClient

    • 説明: 動的クライアント登録が望ましくなく、既存の OAuth クライアントからクライアント ID とシークレットを収集できるインターフェースがある場合、この関数で MCP クライアントを作成できます。ユーザー体験の面では手間が増えますが、動的クライアント登録を有効にしていない MCP サービスも利用できるようにすることをお勧めします。動的クライアント登録には、すべてのプロバイダーが受け入れられるとは限らないセキュリティ上および不正利用上のリスクがいくつか伴うためです。

    • 引数:

      interface CreateKnownCredentialsMcpClientParams {
        /**
         * OAuth クライアント ID。ユーザー入力によって取得する想定です。
         */
        clientId: string;
        /**
         * OAuth クライアントシークレット。ユーザー入力によって取得する想定です。
         */
        clientSecret: string;
        /**
         * OAuth リダイレクト URL。ユーザーの同意後、このルートに
         * 認可コードと state が返されます。
         */
        oauthRedirectUrl: string;
        /**
         * アクセスを要求する OAuth スコープ
         */
        oauthScopes?: string;
        /**
         * MCP サービスのエンドポイント。ユーザー入力によって取得する想定です。
         */
        mcpEndpoint: string;
        /**
         * MCP SDK が作成するクライアントに渡される名前
         * @see https://github.com/modelcontextprotocol/typescript-sdk?tab=readme-ov-file#writing-mcp-clients
         */
        mcpClientName: string;
        /**
         * MCP SDK が作成するクライアントに渡されるバージョン番号
         * @see https://github.com/modelcontextprotocol/typescript-sdk?tab=readme-ov-file#writing-mcp-clients
         */
        mcpClientVersion: string;
        /**
         * 呼び出されると、指定された URL にリダイレクトする関数
         */
        redirect: (url: string) => void;
        /**
         * 認証データ用の永続ストア
         * @see https://github.com/clerk/mcp-tools?tab=readme-ov-file#stores
         */
        store: McpClientStore;
      }
      
    • 戻り値の型:

      interface McpClientReturnType {
        /**
         * 接続された MCP サービスエンドポイントに関連付けられたセッションを表します。
         */
        sessionId: string;
        /**
         * この関数を呼び出すと、MCP サービスへの接続が初期化されます。
         */
        connect: () => void;
        /**
         * より低レベルのプリミティブです。おそらく使用する必要はありません。
         * @see https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/client/streamableHttp.ts#L119
         */
        transport: StreamableHTTPClientTransport;
        /**
         * より低レベルのプリミティブです。おそらく使用する必要はありません。
         * @see https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/client/index.ts#L81
         */
        client: Client;
        /**
         * より低レベルのプリミティブです。おそらく使用する必要はありません。
         * @see https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/client/auth.ts#L13
         */
        authProvider: OAuthClientProvider;
      }
      
  • createDynamicallyRegisteredMcpClient

    • 説明: MCP エンドポイントの URL のみを指定して、新しい MCP クライアントを作成します。OAuth 2.0 Dynamic Client Registration Protocol を介して、認可サーバーに OAuth クライアントをオンデマンドで登録します。

    • 引数:

      interface CreateDynamicallyRegisteredMcpClientParams {
        /**
         * MCP サービスのエンドポイント。ユーザー入力を通じて取得されることを想定しています。
         */
        mcpEndpoint: string;
        /**
         * OAuth リダイレクト URL。ユーザーが同意すると、このルートに
         * 認可コードと state が返されます。
         */
        oauthRedirectUrl: string;
        /**
         * 認可サーバーに作成する OAuth クライアントの名前
         */
        oauthClientName?: string;
        /**
         * 認可サーバーに作成する OAuth クライアントの URI
         */
        oauthClientUri?: string;
        /**
         * アクセスを要求する OAuth スコープ
         */
        oauthScopes?: string;
        /**
         * OAuth クライアントがパブリックか機密かを指定します。
         * @see https://datatracker.ietf.org/doc/html/rfc6749#section-2.1
         */
        oauthPublicClient?: boolean;
        /**
         * MCP SDK が作成するクライアントに渡される名前
         * @see https://github.com/modelcontextprotocol/typescript-sdk?tab=readme-ov-file#writing-mcp-clients
         */
        mcpClientName: string;
        /**
         * MCP SDK が作成するクライアントに渡されるバージョン番号
         * @see https://github.com/modelcontextprotocol/typescript-sdk?tab=readme-ov-file#writing-mcp-clients
         */
        mcpClientVersion: string;
        /**
         * URL を引数として呼び出すと、指定された URL にリダイレクトする関数
         */
        redirect: (url: string) => void;
        /**
         * 認証データ用の永続ストア
         * @see https://github.com/clerk/mcp-tools?tab=readme-ov-file#stores
         */
        store: McpClientStore;
      }
      
    • 戻り値の型:

      interface McpClientReturnType {
        /**
         * 接続された MCP サービスエンドポイントに関連付けられたセッションを表します。
         */
        sessionId: string;
        /**
         * この関数を呼び出すと、MCP サービスへの接続が初期化されます。
         */
        connect: () => void;
        /**
         * より低レベルのプリミティブです。おそらく使用する必要はありません。
         * @see https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/client/streamableHttp.ts#L119
         */
        transport: StreamableHTTPClientTransport;
        /**
         * より低レベルのプリミティブです。おそらく使用する必要はありません。
         * @see https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/client/index.ts#L81
         */
        client: Client;
        /**
         * より低レベルのプリミティブです。おそらく使用する必要はありません。
         * @see https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/client/auth.ts#L13
         */
         authProvider: OAuthClientProvider;
      }
      
  • getClientBySessionId

    • 説明: 既存のセッション ID を指定すると、クライアント/セッションの初期作成時に使用した情報と一致する MCP クライアントを構築します。OAuth コールバックルート、およびサービスの初期化後に行う後続の MCP 呼び出しでの使用を想定しています。
    • 引数:
    interface GetClientBySessionIdParams {
      /**
       * The session id to retrieve the client details for
       */
      sessionId: string;
      /**
       * A persistent store for auth data
       * @see https://github.com/clerk/mcp-tools?tab=readme-ov-file#stores
       */
      store: McpClientStore;
      /**
       * If using this function in the OAuth callback route, pass in the state to
       * ensure that PKCE can run correctly.
       */
      state?: string;
    }
    
    • 戻り値の型:

      interface McpClientReturnType {
        /**
         * 接続された MCP サービスエンドポイントに関連付けられたセッションを表します。
         */
        sessionId: string;
        /**
         * この関数を呼び出すと、MCP サービスへの接続が初期化されます。
         */
        connect: () => void;
        /**
         * 低レベルのプリミティブであり、通常は使用する必要はありません。
         * @see https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/client/streamableHttp.ts#L119
         */
        transport: StreamableHTTPClientTransport;
        /**
         * 低レベルのプリミティブであり、通常は使用する必要はありません。
         * @see https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/client/index.ts#L81
         */
        client: Client;
        /**
         * 低レベルのプリミティブであり、通常は使用する必要はありません。
         * @see https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/client/auth.ts#L13
         */
        authProvider: OAuthClientProvider;
      }
      
  • completeAuthWithCode

    • 説明: OAuth コールバックルートでの使用を想定しています。コード、state、およびストアを渡すと、認証プロセスが完了します。

    • 引数:

      interface CompleteAuthWithCodeParams {
        /**
         * クエリ文字列を介して認証プロバイダーから返される認可コード。
         * @see https://datatracker.ietf.org/doc/html/rfc6749#section-4.1
         */
        code: string;
        /**
         * クエリ文字列を介して認証プロバイダーから返される state。
         * @see https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.1
         */
        state: string;
        /**
         * 認証データを保存する永続ストア
         * @see https://github.com/clerk/mcp-tools?tab=readme-ov-file#stores
         */
        store: McpClientStore;
      }
      
    • 戻り値の型:

      interface CompleteAuthWithCodeReturnType {
        /**
         * 低レベルのプリミティブであり、通常は使用する必要はありません。
         * @see https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/client/streamableHttp.ts#L119
         */
        transport: StreamableHTTPClientTransport;
        /**
         * 接続された MCP サービスエンドポイントに関連付けられたセッションを表します。
         */
        sessionId: string;
      }
      
スコープ:@clerk/mcp-tools/server
  • generateProtectedResourceMetadata

    • 説明: RFC 9728 で定義されている OAuth 2.0 Protected Resource Metadata を生成します。このメタデータにより、OAuth クライアントはリソースサーバーでの認証方法を把握できます。

    • 引数:

      interface GenerateProtectedResourceMetadataParams {
        /**
         * OAuth 認可サーバーの URL
         */
        authServerUrl: string;
        /**
         * メタデータの適用対象となるリソースサーバーの URL
         */
        resourceUrl: string;
        /**
         * メタデータに含める追加プロパティ
         */
        properties?: Record<string, any>;
      }
      
    • 戻り値の型:

      {
        resource: string;
        authorization_servers: string[];
        token_types_supported: string[];
        token_introspection_endpoint: string;
        token_introspection_endpoint_auth_methods_supported: string[];
        jwks_uri: string;
        authorization_data_types_supported: string[];
        authorization_data_locations_supported: string[];
        key_challenges_supported: Array<{
          challenge_type: string;
          challenge_algs: string[];
        }>;
        [key: string]: any; // 指定された場合の追加プロパティ
      }
      
  • generateClerkProtectedResourceMetadata

    • 説明: Clerk 認証用に構成された OAuth 2.0 Protected Resource Metadata を生成します。これは generateProtectedResourceMetadata の便利なラッパーで、Clerk の公開可能キーから認証サーバーの URL を自動的に導出します。

    • 引数:

      interface GenerateClerkProtectedResourceMetadataParams {
        /**
         * Clerk の公開可能キー(例:pk_test_... または pk_live_...)
         */
        publishableKey: string;
        /**
         * メタデータの適用先となるリソースサーバーの URL
         */
        resourceUrl: string;
      }
      
    • 戻り値の型: generateProtectedResourceMetadata と同じ

  • fetchClerkAuthorizationServerMetadata

    • 説明: 公開可能キーに基づいて、Clerk のサーバーから OAuth 2.0 Authorization Server Metadata を取得します。ローカルで生成するのではなく、Clerk の認証サーバーから実際のメタデータを返します。

    • 引数:

      interface FetchClerkAuthorizationServerMetadataParams {
        /**
         * Clerk の公開可能キー(例:pk_test_... または pk_live_...)
         */
        publishableKey: string;
      }
      
    • 戻り値の型:

      Promise<{
        issuer: string;
        authorization_endpoint: string;
        token_endpoint: string;
        userinfo_endpoint: string;
        jwks_uri: string;
        registration_endpoint?: string;
        scopes_supported: string[];
        response_types_supported: string[];
        response_modes_supported: string[];
        grant_types_supported: string[];
        subject_types_supported: string[];
        id_token_signing_alg_values_supported: string[];
        token_endpoint_auth_methods_supported: string[];
        claims_supported: string[];
        code_challenge_methods_supported: string[];
        [key: string]: any; // Clerk からの追加メタデータ
      }>;
      
  • isClerkAuthInfo

    • 説明: AuthInfo オブジェクトが verifyClerkToken に由来する場合、true を返します。この関数は結果に extra.verifiedBy: 'clerk' を付与します。Clerk のユーザー ID とクライアント ID を、カスタム検証器が生成したものと区別するために使用します。
    • パラメーター: authInfo: AuthInfo | undefined
    • 戻り値: boolean
  • corsHeaders

    • 説明: OAuth メタデータエンドポイント用に事前設定された CORS ヘッダーです。これらのヘッダーにより、OAuth メタデータエンドポイントへのクロスオリジンリクエストが許可されます。これはウェブベースの MCP クライアントに必要です。

    • 値:

      {
        "Access-Control-Allow-Origin": "*";
        "Access-Control-Allow-Methods": "GET, OPTIONS";
        "Access-Control-Allow-Headers": "*";
        "Access-Control-Max-Age": "86400";
      }
      

サーバーユーティリティとフレームワーク固有の実装について詳しくは、以下を参照してください。

フレームワーク固有のユーティリティ

フレームワーク固有のユーティリティとハンドラーについては、以下を参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。