Simple MCP Server with upstream auth via local rest endpoint について
セッション認証によってツールへのアクセスを制御する、MCPサーバーのプロトタイプです。Quarkus OIDCとGitHub OAuthを使い、ユーザーのGitHubアクセストークンをセッションごとに保存します。
主な機能
- 01セッション単位のツールアクセス制御
- 02GitHub OAuth認証
- 03セッションごとのアクセストークン保存
活用シーン
- 01認証必須のMCPツールの試作
- 02リポジトリのIssue一覧表示前にGitHub認証を求める
MCP 対応
セッション認証の状態に応じて利用できるMCPツールを公開します。ユーザーはQuarkus OIDCとGitHub OAuthを使い、ローカルURL経由で認証します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
ローカルの REST エンドポイント経由で上流の認証を行うシンプルな MCP サーバー
これは、MCP サーバーがツールを提供しつつ、内部状態に基づいてツールへのアクセスを制限し、ユーザーに外部 URL 経由での認証を求めるプロトタイプです。
この場合、外部 URL は Quarkus OIDC でラップされており、GitHub 経由での認証が必要です。
その後、GitHub のアクセストークンは、ユーザーが使用する sessionid に対応するセッション用に MCP 内に保存されます。
注:GitHub OAuth アプリの client-id と secret を追加するため、application.properties を編集する必要があります。
要件
- JBang
- GitHub の OAuth2 アプリ
- Claude などの MCP クライアント
GitHub の OAuth2 アプリを作成する
https://github.com/settings/developers に移動します。
左側のナビゲーションから OAuth Apps を選択します。
「New OAuth App」をクリックします。
アプリ名を入力し、コールバック URL に http://127.0.0.1:8080/auth を設定します。
client ID を application.properties にコピーします。 「generate a new client secret」をクリックし、secret を application.properties にコピーします。
Claude デスクトップの設定 JSON を更新します……
Windows の場合……
{
"mcpServers": {
"ozzynet": {
"command": "cmd",
"args": [
"/c",
"C:\\Users\\YOURUSERNAME\\.jbang\\bin\\jbang.cmd",
"--quiet",
"org.ozzy:stiletto:1.0.0-SNAPSHOT:runner" ]
}
}
}
Mac の場合……
{
"mcpServers": {
"ozzynet": {
"command": "jbang",
"args": [
"--quiet",
"org.ozzy:stiletto:1.0.0-SNAPSHOT:runner" ]
}
}
}
テスト……
Claude にリポジトリの issue を一覧表示するよう依頼します……
例:quarkusio の quarkus リポジトリの issue を一覧表示します。
Claude は getSessionId ツールの呼び出し許可を求めます。
その後、Claude は listIssues ツールを呼び出しますが、認証が必要なため利用できないと報告し、http://127.0.0.1/auth?sessionId=<UUID> の形式のリンクを提示します。このリンクをクリックすると、GitHub にリダイレクトされ、作成した OAuthApp 経由で認証するよう求められます。認証が完了したら、Claude に戻って一覧表示を再試行できます。=)
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。