delinea-mcp

公式

Delinea Secret ServerおよびPlatform API向けの公式Delinea MCPサーバー

ドキュメント

DelineaMCP

Delinea Secret Server および Platform API 向け MCP サーバー

License


機能

  • Secret Server に対する自動認証
  • フォルダ、シークレット、ユーザー、グループ、ロールを管理するための豊富な Secret Server ツールセット。 受信トレイやアクセスリクエストのヘルパー、コーディングエージェントユーティリティを含みます。
  • 制御された AI インタラクションのための ChatGPT 互換ツール (search および fetch)。
  • オプションの Delinea Platform ユーザー管理ツール
  • Server Sent Events または STDIO トランスポートモードをサポート
  • MCP 仕様に基づく動的クライアント登録を伴う OAuth 2.0
  • セキュアな接続のための TLS サポート
  • すぐに実行可能な Docker イメージと開発サーバーエントリポイント
  • ChatGPT、Claude Desktop、リモート Claude コネクター、VSCode Copilot、openwebui でテスト済み

インストール

[!NOTE]

このプロジェクトは uv (https://github.com/astral-sh/uv) を使用しますが、これを使用せずにコマンドを実行したい場合は、通常通り pip および venv コマンドを実行できます。

  • Uv をインストール
  • プロジェクトを初期化: uv pip sync requirements.txt
  • uv run server.py --config config.json を使用

設定

パスワードなどのシークレットは、引き続き環境変数から取得されます。 シェル環境で DELINEA_PASSWORD を提供してください。 オプション機能は、AZURE_OPENAI_KEYPLATFORM_SERVICE_PASSWORD などの追加の変数に依存します。

シークレット以外のパラメーターは config.json に属します:

{
  "delinea_username": "<username>",
  "delinea_base_url": "https://your-secret-server/SecretServer",
  "platform_hostname": "<tenant>.secureplatform.io",
  "platform_service_account": "<service_account>",
  "platform_tenant_id": "<tenant_id>",
  "azure_openai_endpoint": "https://example.openai.azure.com/",
  "azure_openai_deployment": "<deployment_name>",
  "auth_mode": "none",
  "transport_mode": "stdio",
  "chatgpt_disable_scope_checks": false,
  "port": 8000,
  "debug": false,
  "external_hostname": null,
  "ssl_keyfile": null,
  "ssl_certfile": null,
  "registration_psk": null,
  "jwt_key_path": ".cache/jwt.json",
  "oauth_db_path": ".cache/oauth.db",
  "enabled_tools": []
}

Secret Server Cloud の場合は、/SecretServer なしでクラウド URL を使用するだけです。 HTTPS を有効にするには、ssl_keyfilessl_certfile を指定します。 Let's Encrypt の場合は、privkey.pem ファイルと fullchain.pem ファイルを使用します。

設定ファイルは以下のキーをサポートします:

  • delinea_username - Secret Server のユーザー名。実行したいタスクの権限を持つプログラムユーザーである必要があります。
  • delinea_base_url - Secret Server インスタンスのベース URL。
  • platform_hostname - Platform テナントのホスト名 (Platform ツールを有効にします)。
  • platform_service_account - Platform API で使用されるサービスアカウント。
  • platform_tenant_id - Platform API リクエスト用のテナント ID。
  • azure_openai_endpoint - Azure OpenAI エンドポイント。自動レポート生成が必要な場合のみ設定します (ほとんどのエージェントは独自のレポート SQL を生成できるため、必要でない限り有効にしないでください)。
  • azure_openai_deployment - Azure OpenAI のデプロイ名。
  • auth_mode - 認証モード (none または oauth)。OAuth は stdio トランスポートでは明らかに機能しません。
  • transport_mode - コマンドライン用の stdio または HTTP/SSE 用の sse
  • chatgpt_disable_scope_checks - ChatGPT リクエストのスコープ検証をスキップします。ChatGPT への接続で問題が発生した場合にのみ有効にしてください。
  • port - sse モードでの HTTP サーバーのポート。
  • debug - 詳細ログを有効にします。
  • external_hostname - OAuth トークンオーディエンスを構築する際に使用されるホスト名。HTTP(S) プレフィックスやポートを追加しないでください。
  • ssl_keyfile - HTTPS 用の SSL キーへのパス。(例 privkey.pem)
  • ssl_certfile - HTTPS 用の SSL 証明書へのパス。(例 fullchain.pem)
  • registration_psk - OAuth クライアントを登録するために必要な事前共有キー。OAuth 接続を承認するために、ブラウザでこのシークレットを入力する必要があります。
  • jwt_key_path - OAuth トークンに使用される RSA キーペアの場所。デフォルトは .cache/jwt.json です。存在しない場合は自動生成されます。
  • oauth_db_path - OAuth データベースファイルへのパス。デフォルトは .cache/oauth.db です。存在しない場合は自動生成されます。
  • enabled_tools - 登録するツール名のリスト。空のリストはすべてのツールを有効にします。ユースケースやタスクごとにツールを選択的に有効にすることを強くお勧めします。例については docs/ フォルダーを参照してください。
  • search_objects - search ツールで許可されるオブジェクトタイプ。 デフォルトは ["secret"] ですが、userfoldergrouprole を含めることができます。
  • fetch_objects - fetch ツールで許可されるオブジェクトタイプ。 デフォルトは ["secret"] ですが、search_objects と同じ値を含めることができます。

サーバーの実行

開発モードでサーバーをローカルで起動します:

python server.py

起動時に、サーバーはベアラートークンを要求し、後続の API リクエストのために保存します。 このプロジェクトは、Secret Server API とのさらなる統合のために拡張される予定です。

MCP ツール

サーバーは、Secret Server と対話するためのいくつかの MCP ツールを公開します:

  • run_report(sql_query, report_name=None) - 一時レポートを作成して実行します。
  • ai_generate_and_run_report(description) - Azure OpenAI を使用して SQL を生成し、実行します。 Azure OpenAI 変数が必要です。
  • list_example_reports() - サンプルクエリとテーブル情報を一覧表示します。
  • get_secret(id, summary=False) - シークレットまたはサマリーの詳細を取得します。
  • get_folder(id) - フォルダのメタデータと子を取得します。
  • search_users(query) - アクティブユーザーを検索します。
  • search_secrets(query, lookup=False) - シークレットを検索または検索します。
  • search_folders(query, lookup=False) - フォルダを検索または検索します。
  • get_secret_environment_variable(secret_id, environment) - 指定されたシェルでシークレット資格情報を取得するためのスクリプトを出力します。
  • check_secret_template(template_id) - シークレットテンプレートの詳細を取得します。
  • check_secret_template_field(template_id, field_id) - テンプレートにフィールドが含まれているかどうかを確認します。
  • get_secret_template_field(field_id) - ID によって特定のシークレットテンプレートフィールドに関する詳細を取得します。
  • handle_access_request(request_id, status, response_comment, start_date=None, expiration_date=None) - アクセスリクエストを承認または拒否します。
  • get_pending_access_requests() - 保留中のアクセスリクエストを一覧表示します。
  • get_inbox_messages(read_status_filter=None, take=20, skip=0) - 受信トレイメッセージを取得します。
  • mark_inbox_messages_read(message_ids, read=True) - メッセージを既読または未読としてマークします。
  • user_management(action, user_id=None, data=None, skip=0, take=20, is_exporting=False) - 統合ユーザー操作。 actiongetcreateupdatedeletelist_sessionsreset_2fareset_password、または lock_out を受け入れます。 必要に応じて user_id を提供し、作成、更新、パスワードリセットアクションのリクエストボディを data 経由で提供します。 例: user_management("reset_password", user_id=42, data={"newPassword": "Pa$$w0rd"})
  • role_management(action, role_id=None, data=None, params=None) - ロールを管理します。 actionlistgetcreate、または update です。 ロールを一覧表示するときに、params でオプションのクエリパラメーターを渡します。 例: role_management("update", role_id=3, data={"name": "New Role"})
  • user_role_management(action, user_id, role_ids=None) - ユーザーにロールを割り当てるか、ユーザーからロールを削除します。 actiongetadd、または remove であり、role_ids は追加/削除操作のロール識別子のリストです。
  • group_management(action, group_id=None, data=None, params=None) - グループを処理します。 actiongetlistcreate、または delete です。 get/delete には group_id を提供し、グループを作成するときは data を提供します。
  • folder_management(action, folder_id=None, data=None, params=None) - フォルダを管理します。 actiongetlistcreateupdate、または delete です。 get、update、または delete には folder_id を提供し、フォルダを作成または更新するときは data を提供します。
  • user_group_management(action, user_id, group_ids=None) - ユーザーのグループメンバーシップを管理します。 actiongetadd、または remove です。 メンバーシップを追加または削除するときに、group_ids のリストを提供します。
  • group_role_management(action, group_id, role_ids=None) - グループのロールを制御します。 listadd、または remove アクションを使用します。 追加または削除するときに role_ids を提供します。
  • health_check() - Secret Server のヘルスチェックエンドポイントをクエリし、現在のサービスステータスを返します。

認証には、上記のサーバー設定変数を使用します。 Azure OpenAI 変数がない場合、AI ツールは自動的に無効になります。 config.json にリストされているツール名のみが登録されます。 空のリストはすべてのツールを有効にします。

ユースケース

ドキュメントでは、ツールをサーバーに接続するためのいくつかのワークフローについて説明しています:

Docker クイックスタート

Python 依存関係をローカルにインストールせずに MCP サーバーを実行するための Dockerfile が提供されています。

  1. イメージをビルドします:
docker build -t dev.local/delinea-mcp:latest .
  1. サーバーを実行します (環境変数経由で資格情報を渡します):
docker run --rm -p 8000:8000 \
  -e DELINEA_PASSWORD=<password> \
  -e PLATFORM_SERVICE_PASSWORD=<password> \
  -e DELINEA_DEBUG=1 \
  -e AZURE_OPENAI_KEY=<your-key-or-appropriate-token> \
  -v $(pwd)/config.json:/app/config.json:ro \
  -v mcp-data:/app/data \
  dev.local/delinea-mcp:latest

上記のように、config.json にユーザー名と URL を入力します。

コンテナーは oauth.dbjwt.json/app/data に保存します。 これらのファイルと HTTPS 証明書が実行間で保持されるように、ボリューム (上記では mcp-data として表示) をマウントします。

接続エラーを回避するために、<https://your-secret-server/SecretServer> を Secret Server インスタンスのベース URL に置き換えます。

サーバーはデフォルトで python server.py を使用してポート 8000 で起動します。 デフォルトを上書きするには、config.jsonport オプションを設定します。 debug: true を有効にすると、すべての受信 HTTP リクエストがログに記録されます。

サンプルスクリプト

manual_secret_request.py スクリプトは、特定のシークレット ID の OAuth トークンを取得する方法を示しています:

python scripts/manual_secret_request.py <Secret_ID>

スクリプトを実行する前に、シークレットの環境変数 SECRET_USERNAME_<id>SECRET_PASSWORD_<id> を設定します。 オプションで DELINEA_BASE_URL を設定して、デフォルトの https://localhost/SecretServer を上書きします。

テストの実行

100% のコードカバレッジを確保するために、カバレッジ付きで単体テストを実行します:

pip install -r requirements.txt
coverage run -m pytest -q
coverage report --omit "tests/*"

ライブテスト

一部の統合テストには有効な資格情報が必要です。 スイートを実行する前に、次の環境変数とオプションの LIVE_SECRET_ID を設定します:

export DELINEA_PASSWORD=<password>
# Optional secret used by tests/test_live.py
export LIVE_SECRET_ID=<id>
export SECRET_USERNAME_<id>=<secret_username>
export SECRET_PASSWORD_<id>=<secret_password>

これらの変数が存在する場合、ライブテストは実際の API リクエストを実行します。

本番環境へのデプロイ

依存関係は requirements.txt に固定されており、リリースには セマンティックバージョニング を使用してタグが付けられます。 タグ付けされたコミットから Docker イメージをビルドし、必要な環境変数 (DELINEA_USERNAMEDELINEA_PASSWORD、オプションで DELINEA_BASE_URL) を渡して本番環境にデプロイします。 オプション機能は追加の変数に依存します:

  • PLATFORM_SERVICE_PASSWORDPLATFORM_HOSTNAMEPLATFORM_SERVICE_ACCOUNTPLATFORM_TENANT_ID を組み合わせることで、ユーザー管理ツールが有効になります。
  • AZURE_OPENAI_KEYAZURE_OPENAI_ENDPOINTAZURE_OPENAI_DEPLOYMENT を組み合わせることで、AI レポート生成ヘルパーが有効になります。

OAuth または SSE トランスポートで実行する場合、registration_psk を提供し、external_hostname または HTTPS 証明書ファイルを設定する必要がある場合があります。

リポジトリレイアウト

  • delinea_mcp/ - MCP ツールを含むパッケージ。
  • server.py - すべてを MCP サーバーに登録する薄いエントリポイント。
  • docs/ - プロジェクトドキュメントと生成された delinea-secret-server-openapi-spec.json
  • scripts/ - manual_secret_request.py を含むヘルパー例。

セキュリティに関する考慮事項

含まれている OAuth エンドポイントは、開発とテストを目的としています。 /oauth/authorize ルートは任意の redirect_uri を受け入れ、検証なしでユーザーをリダイレクトします。 デプロイでは、この値を承認されたコールバック URL に制限する必要があります。そうしないと、攻撃者が悪意のある URL を提供し、認証コードを取得する可能性があります。 背景については オープンリダイレクション を参照してください。

リリースノート

最新の機能とロードマップ項目の概要については、docs/release_notes.md を参照してください。

ロードマップ

  1. パススルー認証
  2. ストリーミング HTTP トランスポートのサポート
  3. Delinea Platform でのツールカバレッジの拡大と、他の Delinea 製品の追加

貢献

貢献を歓迎します! 改善のための issue や pull request をお気軽に作成してください。 すべての新しいコードには単体テストを含め、既存のテストスイートに合格する必要があります。

ライセンス

このプロジェクトは MIT ライセンス の下でライセンスされています。