mcp-superleap-oauth-dcr
OAuth 2.1、Dynamic Client Registration、PKCE、アクセストークンのリフレッシュ、または保護されたリソースのメタデータ検出が必要なリモートMCPサーバーに接続する場合に使用します。
description の原文を見る
Use when connecting a remote MCP server that requires OAuth 2.1, Dynamic Client Registration, PKCE, access-token refresh, or protected-resource metadata discovery.
SKILL.md 本文
MCP OAuth + Dynamic Client Registration
概要
リモート MCP サーバーが静的ベアラートークンで設定できず、代わりに OAuth 2.1 認可を必要とする場合は、このスキルを使用します。ホストされている多くの MCP サーバーは、保護されたリソースメタデータ、Dynamic Client Registration (DCR)、Authorization Code + PKCE、およびリフレッシュトークンを使用します。
目標は、サーバーの OAuth メタデータを検出し、Hermes または別の MCP クライアントを動的に登録し、ブラウザベースの承認ステップを通じてアクセストークンを取得し、トークンセットを安全に保存し、アクセストークンの有効期限が切れたときに自動的にリフレッシュすることです。
使用するタイミング
以下の場合に使用します:
- リモート MCP エンドポイントが
WWW-Authenticateヘッダー付きで401 Unauthorizedを返す WWW-Authenticateヘッダーにresource_metadata=...が含まれている- MCP プロバイダーが静的 API キーまたは長期的なベアラートークンを提供していない
- プロバイダーが OAuth 2.1、PKCE、または Dynamic Client Registration を想定している
- アクセストークンの有効期限が切れた後に MCP 呼び出しが失敗を始め、リフレッシュトークンを使用する必要がある
以下の場合は使用しないでください:
npx、uvx、または別のローカルコマンドで起動されたローカル stdio MCP サーバー- すでに静的ベアラートークンを提供し、OAuth を必要としないリモート MCP サーバー
- プロバイダーが同じメタデータおよび PKCE パターンに従わない限り、非 MCP OAuth 統合
必要な概念
- 保護されたリソースメタデータ: リソースサーバーによって公開される OAuth メタデータ。通常は
WWW-Authenticateレスポンスから検出されます - 認可サーバーメタデータ: OAuth サーバーメタデータ。通常は発行者の
/.well-known/oauth-authorization-serverで利用可能です - Dynamic Client Registration (DCR): クライアントが自己登録し、実行時に
client_idを受け取るフロー - PKCE: Proof Key for Code Exchange。パブリッククライアントは
code_verifierを生成し、認可中に派生したcode_challengeを送信します - アクセストークン: MCP リクエストの
Authorization: Bearer ...ヘッダーで使用される短期間のトークン - リフレッシュトークン: ユーザーの再承認を求めずに新しいアクセストークンを取得するために使用される長期間のトークン
- State: OAuth コールバックが開始した認可リクエストに属することを検証するために使用されるランダム値
ディスカバリーフロー
-
MCP エンドポイントをプローブします
認証情報なしで MCP サーバー URL にリクエストを送信するか、失敗をテストしている場合は現在の認証情報を使用して送信します
OAuth で保護されたサーバーの期待される結果:
HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer resource_metadata="https://example.com/.well-known/oauth-protected-resource" -
WWW-Authenticateヘッダーからresource_metadataURL を抽出します -
保護されたリソースメタデータを取得します
以下のようなフィールドを探します:
resourceauthorization_serversscopes_supportedbearer_methods_supported
-
認可サーバーの発行者を特定します
保護されたリソースメタデータから発行者または認可サーバー URL を使用します
-
認可サーバーメタデータを取得します
一般的なパス:
<issuer>/.well-known/oauth-authorization-server以下を探します:
authorization_endpointtoken_endpointregistration_endpointgrant_types_supportedresponse_types_supportedcode_challenge_methods_supportedtoken_endpoint_auth_methods_supported
Dynamic Client Registration フロー
認可サーバーメタデータから registration_endpoint でパブリッククライアントを登録します
以下のようなペイロードを使用します:
{
"client_name": "Hermes MCP Client",
"redirect_uris": ["http://127.0.0.1:49152/callback"],
"grant_types": ["authorization_code", "refresh_token"],
"response_types": ["code"],
"token_endpoint_auth_method": "none"
}
ガイドライン:
- 一時的なポート上のローカルホストリダイレクト URI を使用します
- プロバイダーがリダイレクトマッチングについて厳密な場合は、
localhostの代わりに127.0.0.1を使用します - プロバイダーがリフレッシュトークンをサポートしている場合は、
authorization_codeとrefresh_tokenの両方のグラントをリクエストします - パブリッククライアントに対して
token_endpoint_auth_method: noneを使用します。ただし、登録レスポンスでクライアントシークレットが提供され、クライアント認証が明示的に必要とされている場合を除きます - 返された
client_idを保存します。一部のプロバイダーはclient_secret、client_id_issued_at、またはclient_secret_expires_atも返す可能性があります
Authorization Code + PKCE フロー
-
ログイン試行ごとに新しい OAuth 値を生成します:
state: 高エントロピーのランダム文字列code_verifier: 高エントロピーのランダム文字列code_challenge: ベリファイアの SHA-256 ハッシュの base64url エンコードcode_challenge_method:S256
-
メタデータから
authorization_endpointを使用して認可 URL を構築します以下を含めます:
authorize_url=https://app.superleap.com/api/v1/oauth/authorizeresponse_type=codeclient_id=<dynamic client id>redirect_uri=<exact registered redirect uri>state=<random state>code_challenge=<S256 challenge>code_challenge_method=S256- プロバイダーが RFC 8707 リソースインジケータを必要とする場合は
resource=<MCP resource URL> - メタデータまたはプロバイダードキュメントでスコープが必要な場合は
scope=<requested scopes>
-
認可 URL をブラウザで開くか、ユーザーに提示します
https://<subdomain>.superleap.com/mcp/authorize?authorize_url=https://app.superleap.com/api/v1/oauth/authorize&client_id=<client_id>&redirect_uri=<redirect_uri>&code_challenge=<code_challenge>&state=<state>&code_challenge_method=S256&resource=<resource>&response_type=code&client_name=<yourname> -
リダイレクト URI ポートで一時的なローカルホストコールバックリスナーを実行します
-
プロバイダーがリダイレクト バックするときに、以下を検証します:
- コールバックに
codeが含まれている - 返された
stateが保存されたステートと完全に一致する errorまたはerror_descriptionがある場合は処理し、明確に表示される
- コールバックに
-
トークンエンドポイントで認可コードを交換します
フォームエンコードされたパラメータを使用します:
grant_type=authorization_code code=<authorization code> redirect_uri=<exact redirect uri> client_id=<dynamic client id> code_verifier=<original code verifier> resource=<MCP resource URL, if required by provider> -
トークンレスポンスを安全に保存します
典型的なレスポンスフィールド:
access_tokentoken_typeexpires_inrefresh_tokenscope
-
以下で MCP 接続を再試行します:
Authorization: Bearer <access_token>
Superleap テナント/サブドメインルール (重要)
Superleap MCP URL では、ホスト名 mcp.superleap.com または OAuth 発行者 app.superleap.com からユーザー向けテナントを推測しないでください
MCP リソース URL パスからテナントサブドメインを導き出します:
https://mcp.superleap.com/<tenant>/mcp
例:
MCP リソース URL: https://mcp.superleap.com/apple/mcp
テナント/サブドメイン: apple
保護されたリソースメタデータ: https://mcp.superleap.com/apple/.well-known/oauth-protected-resource
重要なルール:
- MCP URL が
https://mcp.superleap.com/apple/mcpの場合、常にappleをテナント/サブドメインとして使用します - リソースインジケータが必要な場合、OAuth 認可 URL およびトークンリクエストで
resource=https://mcp.superleap.com/apple/mcpを保持します - MCP URL にテナントパスが含まれておらず、テナントが別の場所で提供されていない場合にのみ、テナント/サブドメイン
appにフォールバックします
リフレッシュトークンフロー
アクセストークンの有効期限が切れているか、有効期限が近い場合はいつでもリフレッシュトークンを使用します
推奨される動作:
- アクセストークンが発行された時刻を追跡します
expires_at = issued_at + expires_inを計算します- 有効期限の 60~300 秒前など、期限切れになる前に先制的にリフレッシュします
- MCP リクエストが
401 Unauthorizedを返し、トークンの有効期限が近い場合または期限切れの場合は、1 回リフレッシュしてリクエストを再試行します - リフレッシュが
invalid_grant、invalid_client、または失効/期限切れのリフレッシュトークンで失敗した場合は、保存されたトークンセットを破棄し、完全な認可フローを再開します
トークンリフレッシュリクエスト:
grant_type=refresh_token
refresh_token=<stored refresh token>
client_id=<dynamic client id>
resource=<MCP resource URL, if required by provider>
scope=<optional scopes, only if provider requires or allows narrowing>
クライアントが token_endpoint_auth_method: none を使用するパブリッククライアントとして登録された場合は、クライアントシークレットを送信しないでください。プロバイダーがクライアントシークレットを発行し、クライアント認証を必要とする場合は、メタデータおよび登録レスポンスからトークンエンドポイント認証方法に従います
リフレッシュ後:
- 古いアクセストークンを新しいアクセストークンに置き換えます
- 新しい
expires_inからexpires_atを更新します - レスポンスに新しい
refresh_tokenが含まれている場合は、古いリフレッシュトークンを置き換えます。一部のプロバイダーはリフレッシュトークンをローテーションします - 新しいリフレッシュトークンが返されない場合は、既存のリフレッシュトークンを保持します
- 新しいアクセストークンで MCP リクエストを 1 回再試行します
リフレッシュを無限ループしないでください。失敗した MCP リクエストごとに 1 回のリフレッシュと再試行で通常は十分です。繰り返される失敗は再認可またはエラーをトリガーする必要があります
トークンストレージのガイダンス
OAuth ステートとトークンをプロンプトとログの外に保存します
以下を永続化します:
issuerresourceclient_idclient_secret(発行されて必要な場合のみ)redirect_uriaccess_tokenrefresh_tokenexpires_atscope- ディスカバリーに使用されたプロバイダーメタデータ URL
トークンを LLM、ターミナル出力、git 履歴、またはイシューコメントに公開しないでください。以下をマスクします:
- ベアラートークン
- リフレッシュトークン
- 認可コード
- クライアントシークレット
codeを含む完全なコールバック URL
アプリケーションがシークレットマネージャーを持たない場合は、OS キーチェーン、暗号化された認証情報ストア、または厳密なアクセス権限を持つローカルファイルを使用することをお勧めします
プロバイダー固有の例: Superleap <subdomain> MCP
観察されたプロバイダーの詳細:
-
保護されたリソースメタデータ:
https://mcp.superleap.com/<subdomain>/.well-known/oauth-protected-resource -
認可サーバーメタデータ:
https://app.superleap.com/.well-known/oauth-authorization-server -
Dynamic Client Registration エンドポイント:
POST https://app.superleap.com/api/v1/oauth/register -
メタデータからの認可エンドポイント:
https://app.superleap.com/api/v1/oauth/authorize
このプロバイダーでは、サーバーがリソースインジケータを必要とする場合、認可リクエストおよびトークンリクエストで MCP リソース URL を resource= として含めます
https://<subdomain>.superleap.com/mcp/authorize?authorize_url=https://app.superleap.com/api/v1/oauth/authorize&client_id=<client_id>&redirect_uri=<redirect_uri>&code_challenge=<code_challenge>&state=<state>&code_challenge_method=S256&resource=<resource>&response_type=code&client_name=<yourname>
トークン取得後の Hermes 設定
MCP クライアントが有効なアクセストークンを持っており、組み込みの OAuth マネージャーがリフレッシュを処理していない場合は、リモート MCP サーバーを認可ヘッダー付きの HTTP MCP サーバーとして設定します:
mcp_servers:
example_remote:
url: "https://mcp.example.com/mcp"
headers:
Authorization: "Bearer <access_token>"
timeout: 120
connect_timeout: 60
重要:
- 静的 YAML ヘッダーはアクセストークンの有効期限が切れるまでしか機能しません
- 本番使用では、アクセストークンをリフレッシュし、MCP 呼び出しの前にリクエストヘッダーを更新する OAuth トークンマネージャーを追加または使用します
~/.hermes/config.yamlまたは共有リポジトリにトークンをコミットしないでください
よくある落とし穴
-
保護されたリソースディスカバリーをスキップしています。 MCP エンドポイントは、期待される発行者またはメタデータパスと同じものを使用していない可能性があります。
WWW-Authenticateヘッダーから始めます -
古い PKCE 値を使用しています。 認可試行ごとに新しい
state、code_verifier、およびcode_challengeを生成します -
ベリファイアを失っています。 トークン交換には元の
code_verifierが必要です。コールバックが完了するまで、保留中の認可試行とともに保存します -
ステートを検証していません。 トークン交換の前に、返された
stateと保存されたステートを常に比較します -
リダイレクト URI の不一致。 認可リクエストおよびトークン交換の
redirect_uriは、登録されたリダイレクト URI のいずれかと完全に一致する必要があります -
resourceを省略しています。 一部の MCP OAuth プロバイダーは、認可リクエストとトークンリクエストの両方で MCP リソース URL を必要とします -
リフレッシュトークンがローテーションされないと仮定しています。 リフレッシュレスポンスに新しいリフレッシュトークンが含まれている場合は、直ちに新しいトークンを保存します
-
無限リトライループ。
401で 1 回リフレッシュして 1 回再試行します。それでも失敗した場合は、再認可するかエラーを表示します -
コードまたはトークンをリークしています。 コールバック URL には認可コードが含まれています。これらを秘密として扱い、ログから削除します
-
非 PTY オートメーションで
hermes mcp addを使用しています。 これはインタラクティブな TUI にフォールバックして失敗する可能性があります。スクリプト化されたセットアップの場合は、~/.hermes/config.yamlを直接編集し、hermes mcp listで検証します -
プロバイダー固有のエンドポイントを無視しています。 メタデータが利用可能な場合は優先しますが、テスト中に検出されたプロバイダー固有のルートを保持します
検証チェックリスト
- MCP エンドポイントプローブが
WWW-Authenticateメタデータを含む401またはドキュメント化された OAuth チャレンジを返す - 保護されたリソースメタデータが取得され、MCP リソース識別子が記録された
- 認可サーバーメタデータが発行者から取得された
- Dynamic Client Registration が
client_idを返した - 認可 URL に PKCE、ステート、リダイレクト URI、および必要な場合はリソースが含まれている
- コールバックステートがトークン交換前に検証された
- トークン交換がアクセストークンを返した
- リフレッシュトークンが返された場合は保存されている
- アクセストークンの有効期限が
expires_atタイムスタンプで追跡されている - リフレッシュフローが実装され、アクセストークン有効期限の前にテストされている
- アクセストークン有効期限または関連する
401でクライアントが 1 回リフレッシュして MCP リクエストを再試行する - ローテーションされたリフレッシュトークンが古いリフレッシュトークンを置き換える
- トークン、コード、およびクライアントシークレットがログから削除され、コミットされていない
- 認可後に MCP 接続が成功する
最小実装疑似コード
connect_mcp(resource_url):
token = load_token(resource_url)
if token exists and access_token_expires_soon(token):
token = refresh_access_token(token)
save_token(token)
response = mcp_initialize(resource_url, bearer=token.access_token if token else none)
if response.status == 401 and has_resource_metadata(response):
metadata = discover_metadata(response)
client = register_client(metadata.registration_endpoint)
auth_request = create_pkce_authorization_request(metadata, client)
callback = ask_user_to_authorize_and_capture_callback(auth_request.url)
validate_state(callback.state, auth_request.state)
token = exchange_code_for_tokens(metadata.token_endpoint, callback.code, auth_request.code_verifier)
save_token(token)
return mcp_initialize(resource_url, bearer=token.access_token)
if response.status == 401 and token has refresh_token:
token = refresh_access_token(token)
save_token(token)
return mcp_initialize(resource_url, bearer=token.access_token)
return response
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- superleapai
- ライセンス
- MIT
- 最終更新
- 2026/5/7
Source: https://github.com/superleapai/superleap-mcp-hermes-skill / ライセンス: MIT
関連スキル
agent-browser
AI エージェント向けのブラウザ自動化 CLI です。ウェブサイトとの対話が必要な場合に使用します。ページ遷移、フォーム入力、ボタンクリック、スクリーンショット取得、データ抽出、ウェブアプリのテスト、ブラウザ操作の自動化など、あらゆるブラウザタスクに対応できます。「ウェブサイトを開く」「フォームに記入する」「ボタンをクリックする」「スクリーンショットを取得する」「ページからデータを抽出する」「このウェブアプリをテストする」「サイトにログインする」「ブラウザ操作を自動化する」といった要求や、プログラマティックなウェブ操作が必要なタスクで起動します。
anyskill
AnySkill — あなたのプライベート・スキルクラウド。GitHubを基盤としたリポジトリからエージェントスキルを管理、同期、動的にロードできます。自然言語でクラウドスキルを検索し、オンデマンドでプロンプトを自動ロード、カスタムスキルのアップロードと共有、スキルバンドルの一括インストールが可能です。OpenClaw、Antigravity、Claude Code、Cursorに対応しています。
engram
AIエージェント向けの永続的なメモリシステムです。バグ修正、意思決定、発見、設定変更の後はmem_saveを使用してください。ユーザーが「覚えている」「記憶している」と言及した場合、または以前のセッションと重複する作業を開始する際はmem_searchを使用します。セッション終了前にmem_session_summaryを使用して、コンテキストを保持してください。
skyvern
AI駆動のブラウザ自動化により、任意のウェブサイトを自動化できます。フォーム入力、データ抽出、ファイルダウンロード、ログイン、複数ステップのワークフロー実行など、ユーザーがウェブサイトと連携する必要があるときに使用します。Skyvernは、LLMとコンピュータビジョンを活用して、未知のサイトも自動操作可能です。Python SDK、TypeScript SDK、REST API、MCPサーバー、またはCLIを通じて統合できます。
pinchbench
PinchBenchベンチマークを実行して、OpenClawエージェントの実世界タスクにおけるパフォーマンスを評価できます。モデルの機能テスト、モデル間の比較、ベンチマーク結果のリーダーボード提出、またはOpenClawのセットアップがカレンダー、メール、リサーチ、コーディング、複数ステップのワークフローにどの程度対応しているかを確認する際に使用します。
openui
OpenUIとOpenUI Langを使用してジェネレーティブUIアプリを構築できます。これらはLLM生成インターフェースのためのトークン効率的なオープン標準です。OpenUI、@openuidev、ジェネレーティブUI、LLMからのストリーミングUI、AI向けコンポーネントライブラリ、またはjson-render/A2UIの置き換えについて述べる際に使用します。スキャフォルディング、defineComponent、システムプロンプト、Renderer、およびOpenUI Lang出力のデバッグに対応しています。